1 /* Test that SRA replacement can deal with assignments that have 2 sub-replacements on one side and a single scalar replacement on another. */ 3 /* { dg-do run } */ 4 /* { dg-options "-O1" } */ 5 6 struct A 7 { 8 int i1, i2; 9 }; 10 11 struct B 12 { 13 long long int l; 14 }; 15 16 union U 17 { 18 struct A a; 19 struct B b; 20 }; 21 22 int b, gi; 23 long gl; 24 union U gu1, gu2; 25 26 int __attribute__ ((noinline, noclone)) foo(void)27foo (void) 28 { 29 union U x, y; 30 int r; 31 32 y = gu1; 33 if (b) 34 y.b.l = gl; 35 36 x = y; 37 38 if (!b) 39 r = x.a.i1; 40 else 41 r = 0; 42 43 gu2 = x; 44 return r; 45 } 46 47 long long int __attribute__ ((noinline, noclone)) bar(void)48bar (void) 49 { 50 union U x, y; 51 int r; 52 53 y = gu1; 54 if (b) 55 y.a.i1 = gi; 56 57 x = y; 58 59 if (!b) 60 r = x.b.l; 61 else 62 r = 0; 63 64 gu2 = x; 65 return r; 66 } 67 68 69 int main(void)70main (void) 71 { 72 int r; 73 long long int s; 74 75 b = 0; 76 gu1.a.i1 = 123; 77 gu1.a.i2 = 234; 78 r = foo (); 79 if (r != 123) 80 __builtin_abort (); 81 if (gu2.a.i1 != 123) 82 __builtin_abort (); 83 if (gu2.a.i2 != 234) 84 __builtin_abort (); 85 86 b = 1; 87 gl = 10000001; 88 gu1.b.l = 10000000; 89 r = foo (); 90 if (r != 0) 91 __builtin_abort (); 92 if (gu2.b.l != 10000001) 93 __builtin_abort (); 94 95 b = 0; 96 gu1.b.l = 20000000; 97 s = bar (); 98 if (s != (int)20000000) 99 __builtin_abort (); 100 if (gu2.b.l != 20000000) 101 __builtin_abort (); 102 103 b = 1; 104 gi = 456; 105 gu1.a.i1 = 123; 106 gu1.a.i2 = 234; 107 s = bar (); 108 if (s != 0) 109 __builtin_abort (); 110 if (gu2.a.i1 != 456) 111 __builtin_abort (); 112 113 return 0; 114 } 115