1/* { dg-do compile } */ 2/* { dg-options "-O" } */ 3/* { dg-bogus "internal compiler error" "ICE" { target *-*-* } 0 } */ 4 5#undef SKIP 6#define ASMDECL __asm (REG); 7#define CLOBBER_LIST : REG 8#define INP_CLOBBER_LIST : CLOBBER_LIST 9#if defined (__alpha__) 10# define REG "$1" 11#elif defined (__CRIS__) || defined (__sh__) 12# define REG "r10" 13#elif defined (__hppa__) 14# define REG "%r10" 15#elif defined (__i386__) 16# define REG "%eax" 17#elif defined (__MMIX__) 18# define REG "$8" 19#elif defined (__powerpc__) || defined (__PPC__) || defined (__ppc__) \ 20 || defined (__POWERPC__) || defined (PPC) || defined (_IBMR2) 21# define REG "6" 22#elif defined (__x86_64__) 23# define REG "rax" 24#elif defined (__m68k__) 25# define REG "%d0" 26#else 27/* Make this test harmless for any target not recognized above. */ 28# define SKIP 1 29#endif 30 31#ifndef SKIP 32 33struct A 34{ 35 int a; 36}; 37 38struct B 39{ 40 struct A b[3]; 41}; 42 43struct C 44{ 45 struct B c; 46}; 47 48void bug (void) 49{ 50 register char* dst ASMDECL; 51 __asm__ ("":"=g"(*dst): : REG); 52} 53 54/* The tree optimizers currently prevent us from finding an overlap - 55 we end up using a copy of dst rather than dst. 56 But at least make sure we don't get an ICE. */ 57void bug2 (void) 58{ 59 register char* dst ASMDECL; 60 __asm__ ("": :"g"(*dst) CLOBBER_LIST); 61} 62 63void 64foo (void) 65{ 66 register struct C *dst ASMDECL; 67 __asm__ ("" : "=g"(dst->c.b[1].a) INP_CLOBBER_LIST); 68} 69 70#else 71 72int main () 73{ 74 return 0; 75} 76 77#endif 78 79