/* { dg-do compile } */ /* { dg-options "-O2 -fdump-ipa-sra -fdump-tree-optimized" } */ #define DOIT #define DONT extern int extern_leaf (int); /* ----- 1 ----- */ #ifdef DOIT static int __attribute__((noinline)) whee_1 (int i, int j) { return extern_leaf (i * j) + 1; } static int foo_1 (int i, int j); static int __attribute__((noinline)) baz_1 (int i, int j) { int a = 5; if (j) a = foo_1 (i, j - 1); return whee_1 (i, j) + a + 1; } static int __attribute__((noinline)) bar_1 (int i, int j) { return baz_1 (i, j) + 1; } static int __attribute__((noinline)) foo_1 (int i, int j) { return bar_1 (i, j) + 1; } static int __attribute__((noinline)) inter_1 (int i, int j) { return foo_1 (i, j) + 1; } #endif /* ----- 2 ----- */ #ifdef DONT static int __attribute__((noinline)) whee_2 (int i, int j) { return extern_leaf (i * j) + 2; } static int foo_2 (int i, int j); static int __attribute__((noinline)) baz_2 (int i, int j) { int a = 6; if (j) a = foo_2 (i, j - 1); return whee_2 (i, j) + a + 2; } static int __attribute__((noinline)) bar_2 (int i, int j) { return baz_2 (i, j) + 2; } static int __attribute__((noinline)) foo_2 (int i, int j) { return bar_2 (i, j) + 2; } #endif /* ----- entries ----- */ #ifdef DOIT int entry_1 (int i, int j) { inter_1 (i, j); return i + j + 1; } #endif #ifdef DONT int entry_2 (int i, int j) { #ifdef DOIT inter_1 (i, j); #endif return i + j + bar_2 (i, j); } #endif /* { dg-final { scan-ipa-dump-times "Will remove return value" 5 "sra" } } */ /* { dg-final { scan-tree-dump-times "return;" 5 "optimized"} } */