| /* { dg-do run } */ |
| /* { dg-options "-O2 -fipa-sra -fdump-ipa-sra" } */ |
| |
| /* Check of a simple and transitive structure split. */ |
| |
| struct S |
| { |
| float red; |
| void *blue; |
| int green; |
| }; |
| |
| |
| void __attribute__((noipa)) |
| check (float r, int g, int g2) |
| { |
| if (r < 7.39 || r > 7.41 |
| || g != 6 || g2 != 6) |
| __builtin_abort (); |
| } |
| |
| static void |
| __attribute__((noinline)) |
| foo (struct S s) |
| { |
| check (s.red, s.green, s.green); |
| } |
| |
| static void |
| __attribute__((noinline)) |
| bar (struct S s) |
| { |
| foo (s); |
| } |
| |
| int |
| main (int argc, char **argv) |
| { |
| struct S s; |
| |
| s.red = 7.4; |
| s.green = 6; |
| s.blue = &s; |
| |
| bar (s); |
| return 0; |
| } |
| |
| /* { dg-final { scan-ipa-dump-times "Will split parameter" 2 "sra" { xfail { hppa*-*-hpux* && { ! lp64 } } } } } */ |
| /* { dg-final { scan-ipa-dump-times "component at byte offset" 4 "sra" { xfail { hppa*-*-hpux* && { ! lp64 } } } } } */ |