| /* { dg-do link } */ |
| /* { dg-options "-O2" } */ |
| |
| /* We have enough cascading at -O2 to cover the missed control-dependence |
| in SCCVN (which considers the link_error calls to clobber the structs). */ |
| |
| struct example |
| { |
| char a; |
| int b; |
| char c; |
| } *ex1; |
| |
| extern void link_error(void); |
| |
| void |
| bar (void) |
| { |
| ex1->a = 1; |
| ex1->b = 2; |
| ex1->c = 3; |
| |
| if (ex1->a != 1) |
| link_error (); |
| if (ex1->b != 2) |
| link_error (); |
| if (ex1->c != 3) |
| link_error (); |
| |
| } |
| |
| void |
| foo (struct example *ex2) |
| { |
| ex2->a = 1; |
| ex2->b = 2; |
| ex2->c = 3; |
| |
| if (ex2->a != 1) |
| link_error (); |
| if (ex2->b != 2) |
| link_error (); |
| if (ex2->c != 3) |
| link_error (); |
| |
| } |
| |
| int main (void) |
| { |
| bar (); |
| foo (ex1); |
| return 0; |
| } |