| /* { dg-do compile } */ |
| /* { dg-options "-O" } */ |
| /* { dg-bogus "internal compiler error" "ICE" { target *-*-* } 0 } */ |
| |
| #undef SKIP |
| #define ASMDECL __asm (REG); |
| #define CLOBBER_LIST : REG |
| #define INP_CLOBBER_LIST : CLOBBER_LIST |
| #if defined (__alpha__) |
| # define REG "$1" |
| #elif defined (__CRIS__) || defined (__sh__) |
| # define REG "r10" |
| #elif defined (__hppa__) |
| # define REG "%r10" |
| #elif defined (__i386__) |
| # define REG "%eax" |
| #elif defined (__MMIX__) |
| # define REG "$8" |
| #elif defined (__powerpc__) || defined (__PPC__) || defined (__ppc__) \ |
| || defined (__POWERPC__) || defined (PPC) || defined (_IBMR2) |
| # define REG "6" |
| #elif defined (__x86_64__) |
| # define REG "rax" |
| #elif defined (__m68k__) |
| # define REG "%d0" |
| #else |
| /* Make this test harmless for any target not recognized above. */ |
| # define SKIP 1 |
| #endif |
| |
| #ifndef SKIP |
| |
| struct A |
| { |
| int a; |
| }; |
| |
| struct B |
| { |
| struct A b[3]; |
| }; |
| |
| struct C |
| { |
| struct B c; |
| }; |
| |
| void bug (void) |
| { |
| register char* dst ASMDECL; |
| __asm__ ("":"=g"(*dst): : REG); |
| } |
| |
| /* The tree optimizers currently prevent us from finding an overlap - |
| we end up using a copy of dst rather than dst. |
| But at least make sure we don't get an ICE. */ |
| void bug2 (void) |
| { |
| register char* dst ASMDECL; |
| __asm__ ("": :"g"(*dst) CLOBBER_LIST); |
| } |
| |
| void |
| foo (void) |
| { |
| register struct C *dst ASMDECL; |
| __asm__ ("" : "=g"(dst->c.b[1].a) INP_CLOBBER_LIST); |
| } |
| |
| #else |
| |
| int main () |
| { |
| return 0; |
| } |
| |
| #endif |
| |