| /* { dg-do compile } */ |
| /* { dg-options "-O2 -fno-ipa-bit-cp -fno-early-inlining -fdump-ipa-cp -fdump-tree-optimized" } */ |
| /* { dg-skip-if "No alignment restrictions" { { ! natural_alignment_32 } && { ! natural_alignment_64 } } } */ |
| |
| #include <stdint.h> |
| |
| extern int fail_the_test(void *); |
| extern int pass_the_test(void *); |
| extern int diversion (void *); |
| |
| struct somestruct |
| { |
| void *whee; |
| void *oops; |
| }; |
| |
| struct container |
| { |
| struct somestruct first; |
| struct somestruct buf[32]; |
| }; |
| |
| static int __attribute__((noinline)) |
| foo (void *p) |
| { |
| uintptr_t a = (uintptr_t) p; |
| |
| if (a % 4) |
| return fail_the_test (p); |
| else |
| return pass_the_test (p); |
| } |
| |
| int |
| bar (void) |
| { |
| struct container c; |
| return foo (c.buf); |
| } |
| |
| |
| static int |
| through (struct somestruct *p) |
| { |
| diversion (p); |
| return foo (&p[16]); |
| } |
| |
| int |
| bar2 (void) |
| { |
| struct container c; |
| through (c.buf); |
| } |
| |
| /* { dg-final { scan-ipa-dump-not "align:" "cp" } } */ |
| /* { dg-final { scan-tree-dump "fail_the_test" "optimized" } } */ |