| /* { dg-do run } */ |
| /* { dg-options "-O -fdump-tree-ifcombine-details" } */ |
| |
| /* Check that we optimize swapped compares, and that we don't load from objects |
| before they're fully initialized. */ |
| |
| struct pair { |
| signed char a; |
| signed char b; |
| } __attribute__ ((aligned (2))); |
| |
| #define make_pair(a,b) { a, b } |
| |
| struct s { |
| struct pair c; |
| struct pair d; |
| } __attribute__ ((aligned (4))); |
| |
| struct pair cp = make_pair (127, -1); |
| struct pair dp = make_pair (42, 0xf1); |
| |
| struct pair cq = make_pair (127, -1); |
| struct pair dq = make_pair (42, 0xf1); |
| |
| struct pair cr = make_pair (-127, -1); |
| struct pair dr = make_pair (42, 0xff); |
| |
| static __attribute__ ((noinline, noclone, noipa)) |
| struct pair copy_pair (struct pair c) |
| { |
| return c; |
| } |
| |
| static inline |
| struct s |
| make_s (struct pair c, struct pair d) |
| { |
| struct s r; |
| r.c = copy_pair (c); |
| r.d = copy_pair (d); |
| return r; |
| } |
| |
| void f (void) { |
| struct s p = make_s (cp, dp); |
| struct s q = make_s (cq, dr); |
| |
| if (0 |
| || p.c.a != q.c.a |
| || q.c.b != p.c.b |
| || p.d.b != q.d.b |
| || q.d.a != p.d.a |
| ) |
| return; |
| __builtin_abort (); |
| } |
| |
| void g (void) { |
| struct s p = make_s (cp, dp); |
| struct s q = make_s (cr, dq); |
| |
| if (0 |
| || p.c.a != q.c.a |
| || q.c.b != p.c.b |
| || p.d.b != q.d.b |
| || q.d.a != p.d.a |
| ) |
| return; |
| __builtin_abort (); |
| } |
| |
| void h (void) { |
| struct s p = make_s (cp, dp); |
| struct s q = make_s (cq, dq); |
| |
| if (0 |
| || p.c.a != q.c.a |
| || q.c.b != p.c.b |
| || p.d.b != q.d.b |
| || q.d.a != p.d.a |
| ) |
| __builtin_abort (); |
| return; |
| } |
| |
| int main () { |
| f (); |
| g (); |
| h (); |
| return 0; |
| } |
| |
| /* { dg-final { scan-tree-dump-times "optimizing" 9 "ifcombine" { target { ! { avr-*-* pru-*-* } } } } } */ |