| /* PR target/11087 |
| This testcase was miscompiled on ppc64, because basic_induction_var called |
| convert_modes, yet did not expect it to emit any new instructions. |
| Those were emitted at the end of the function and destroyed during life |
| analysis, while the program used uninitialized pseudos created by |
| convert_modes. */ |
| |
| struct A |
| { |
| unsigned short a1; |
| unsigned long a2; |
| }; |
| |
| struct B |
| { |
| int b1, b2, b3, b4, b5; |
| }; |
| |
| struct C |
| { |
| struct B c1[1]; |
| int c2, c3; |
| }; |
| |
| static |
| int foo (int x) |
| { |
| return x < 0 ? -x : x; |
| } |
| |
| int bar (struct C *x, struct A *y) |
| { |
| int a = x->c3; |
| const int b = y->a1 >> 9; |
| const unsigned long c = y->a2; |
| int d = a; |
| unsigned long e, f; |
| |
| f = foo (c - x->c1[d].b4); |
| do |
| { |
| if (d <= 0) |
| d = x->c2; |
| d--; |
| |
| e = foo (c-x->c1[d].b4); |
| if (e < f) |
| a = d; |
| } |
| while (d != x->c3); |
| x->c1[a].b4 = c + b; |
| return a; |
| } |
| |
| int |
| main () |
| { |
| struct A a; |
| struct C b; |
| int c; |
| |
| a.a1 = 512; |
| a.a2 = 4242; |
| __builtin_memset (&b, 0, sizeof (b)); |
| b.c1[0].b3 = 424242; |
| b.c2 = 1; |
| c = bar (&b, &a); |
| return 0; |
| } |