| /* https://bugzilla.redhat.com/show_bug.cgi?id=521991#c5 |
| |
| Distilled from Linux XFS source code. foo, inlined into bar, ends |
| up with debug stmts referencing the addressable variable b. |
| Optimization made it non-addressable, and then completely optimized |
| away, before we got a chance to rename (and discard) the occurrence |
| in the debug stmt. When we did, we crashed, attempting to rename |
| an unreference variable. */ |
| |
| /* { dg-do compile } */ |
| |
| static inline int |
| foo (void *x, unsigned y) |
| { |
| unsigned z = *(unsigned long *) x % y; |
| *(unsigned long *) x = *(unsigned long *) x / y; |
| return z; |
| } |
| |
| struct S |
| { |
| unsigned t; |
| }; |
| |
| void |
| bar (struct S *x, int *y) |
| { |
| int a = 0; |
| unsigned long b = x->t; |
| foo (&b, x->t); |
| for (;; a++) |
| if (b) |
| *y = 1; |
| } |