| /* { dg-do compile } */ |
| /* { dg-options "-O3 -fno-ipa-sra -fdump-ipa-cp-details -fno-early-inlining" } */ |
| /* { dg-add-options bind_pic_locally } */ |
| |
| struct S |
| { |
| int a, b, c; |
| }; |
| |
| void *blah(int, void *); |
| |
| #define foo_body(p)\ |
| { \ |
| int i, c = (p)->c; \ |
| int b = (p)->b; \ |
| void *v = (void *) (p); \ |
| \ |
| for (i= 0; i< c; i++) \ |
| v = blah(b + i, v); \ |
| } |
| |
| static void __attribute__ ((noinline)) |
| foo_v (struct S s) |
| { |
| foo_body (&s); |
| } |
| |
| static void __attribute__ ((noinline)) |
| foo_r (struct S *p) |
| { |
| foo_body (p); |
| } |
| |
| static void |
| goo_v (int a, int *p) |
| { |
| struct S s; |
| s.a = 101; |
| s.b = a % 7; |
| s.c = *p + 6; |
| foo_v (s); |
| } |
| |
| static void |
| goo_r (int a, struct S n) |
| { |
| struct S s; |
| s.a = 1; |
| s.b = a + 5; |
| s.c = -n.b; |
| foo_r (&s); |
| } |
| |
| void |
| entry () |
| { |
| int a; |
| int v; |
| struct S s; |
| |
| a = 9; |
| v = 3; |
| goo_v (a, &v); |
| |
| a = 100; |
| s.b = 18; |
| goo_r (a, s); |
| } |
| |
| /* { dg-final { scan-ipa-dump "offset: 0, type: int, CONST: 1" "cp" } } */ |
| /* { dg-final { scan-ipa-dump "offset: 32, type: int, PASS THROUGH: 0, op plus_expr 5" "cp" } } */ |
| /* { dg-final { scan-ipa-dump "offset: 64, type: int, LOAD AGG: 1 \\\[offset: 32, by value], op negate_expr" "cp" } } */ |
| /* { dg-final { scan-ipa-dump "offset: 0, type: int, CONST: 101" "cp" } } */ |
| /* { dg-final { scan-ipa-dump "offset: 32, type: int, PASS THROUGH: 0, op trunc_mod_expr 7" "cp" } } */ |
| /* { dg-final { scan-ipa-dump "offset: 64, type: int, LOAD AGG: 1 \\\[offset: 0, by reference], op plus_expr 6" "cp" } } */ |
| /* { dg-final { scan-ipa-dump "Aggregate replacements: 0\\\[0]=1\\(by_ref\\), 0\\\[4]=105\\(by_ref\\), 0\\\[8]=-18\\(by_ref\\)" "cp" } } */ |
| /* { dg-final { scan-ipa-dump "Aggregate replacements: 0\\\[0]=101, 0\\\[4]=2, 0\\\[8]=9" "cp" } } */ |