blob: 9cb6367b37478f895d9c7f62cb3f1a369b7f4a79 [file] [log] [blame]
/* { 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"} } */