| /* Test that SRA replacement can deal with assignments that have |
| sub-replacements on one side and a single scalar replacement on another. */ |
| /* { dg-do run } */ |
| /* { dg-options "-O1" } */ |
| |
| struct A |
| { |
| int i1, i2; |
| }; |
| |
| struct B |
| { |
| long long int l; |
| }; |
| |
| union U |
| { |
| struct A a; |
| struct B b; |
| }; |
| |
| int b, gi; |
| long gl; |
| union U gu1, gu2; |
| |
| int __attribute__ ((noinline, noclone)) |
| foo (void) |
| { |
| union U x, y; |
| int r; |
| |
| y = gu1; |
| if (b) |
| y.b.l = gl; |
| |
| x = y; |
| |
| if (!b) |
| r = x.a.i1; |
| else |
| r = 0; |
| |
| gu2 = x; |
| return r; |
| } |
| |
| long long int __attribute__ ((noinline, noclone)) |
| bar (void) |
| { |
| union U x, y; |
| int r; |
| |
| y = gu1; |
| if (b) |
| y.a.i1 = gi; |
| |
| x = y; |
| |
| if (!b) |
| r = x.b.l; |
| else |
| r = 0; |
| |
| gu2 = x; |
| return r; |
| } |
| |
| |
| int |
| main (void) |
| { |
| int r; |
| long long int s; |
| |
| b = 0; |
| gu1.a.i1 = 123; |
| gu1.a.i2 = 234; |
| r = foo (); |
| if (r != 123) |
| __builtin_abort (); |
| if (gu2.a.i1 != 123) |
| __builtin_abort (); |
| if (gu2.a.i2 != 234) |
| __builtin_abort (); |
| |
| b = 1; |
| gl = 10000001; |
| gu1.b.l = 10000000; |
| r = foo (); |
| if (r != 0) |
| __builtin_abort (); |
| if (gu2.b.l != 10000001) |
| __builtin_abort (); |
| |
| b = 0; |
| gu1.b.l = 20000000; |
| s = bar (); |
| if (s != (int)20000000) |
| __builtin_abort (); |
| if (gu2.b.l != 20000000) |
| __builtin_abort (); |
| |
| b = 1; |
| gi = 456; |
| gu1.a.i1 = 123; |
| gu1.a.i2 = 234; |
| s = bar (); |
| if (s != 0) |
| __builtin_abort (); |
| if (gu2.a.i1 != 456) |
| __builtin_abort (); |
| |
| return 0; |
| } |