| /* PR tree-optimization/33619 */ |
| /* { dg-do run } */ |
| /* { dg-options "-O2" } */ |
| |
| #ifdef __powerpc__ |
| # define REG1 __asm__ ("3") |
| # define REG2 __asm__ ("4") |
| #elif defined __x86_64__ |
| # define REG1 __asm__ ("rdi") |
| # define REG2 __asm__ ("rsi") |
| #else |
| # define REG1 |
| # define REG2 |
| #endif |
| |
| static inline void |
| bar (unsigned long x, int y) |
| { |
| register unsigned long p1 REG1 = x; |
| register unsigned long p2 REG2 = y; |
| __asm__ volatile ("" : "=r" (p1), "=r" (p2) : "0" (p1), "1" (p2) : "memory"); |
| if (p1 != 0xdeadUL || p2 != 0xbefUL) |
| __builtin_abort (); |
| } |
| |
| __attribute__((const, noinline)) int |
| baz (int x) |
| { |
| return x; |
| } |
| |
| __attribute__((noinline)) void |
| foo (unsigned long *x, int y) |
| { |
| unsigned long a = *x; |
| bar (a, baz (y)); |
| } |
| |
| int |
| main (void) |
| { |
| unsigned long a = 0xdeadUL; |
| foo (&a, 0xbefUL); |
| return 0; |
| } |