| /* { dg-do run } */ |
| /* { dg-skip-if "asm operand has impossible constraints" { hppa*-*-* } } */ |
| /* { dg-additional-options "-fstack-protector" { target fstack_protector } } */ |
| /* { dg-additional-options "-fPIC" { target fpic } } */ |
| |
| struct S { int *l, *u; }; |
| int a[3]; |
| |
| __attribute__((noipa)) struct S |
| foo (void) |
| { |
| int *p = a, *q = a + 1; |
| struct S s; |
| asm volatile ("" : "+g" (p), "+g" (q) : : "memory"); |
| s.l = p; |
| s.u = q; |
| a[0]++; |
| return s; |
| } |
| |
| __attribute__((noipa)) void |
| bar (struct S *x) |
| { |
| asm volatile ("" : : "g" (x) : "memory"); |
| if (x->l != a || x->u != a + 1) |
| __builtin_abort (); |
| a[1]++; |
| } |
| |
| __attribute__((noipa)) int |
| baz (int *x, int *y) |
| { |
| int r = -1; |
| asm volatile ("" : "+g" (r) : "g" (x), "g" (y) : "memory"); |
| a[2]++; |
| return r; |
| } |
| |
| __attribute__((noipa)) void |
| quux (void) |
| { |
| asm volatile ("" : : : "memory"); |
| } |
| |
| __attribute__((noipa)) void |
| qux (void) |
| { |
| struct S v = foo (); |
| struct S w; |
| struct S x = foo (); |
| int y = 0; |
| |
| w.l = x.l; |
| w.u = x.u; |
| if (baz (x.l, v.l) > 0) |
| { |
| w.l = v.l; |
| y = 1; |
| quux (); |
| } |
| if (baz (x.u, v.u) < 0) |
| { |
| w.u = v.u; |
| y = 1; |
| } |
| if (y) |
| bar (&w); |
| } |
| |
| int |
| main () |
| { |
| qux (); |
| if (a[0] != 2 || a[1] != 1 || a[2] != 2) |
| __builtin_abort (); |
| return 0; |
| } |