blob: 2bffe297c745603883ab685824857306a920d441 [file] [log] [blame]
/* { dg-do compile } */
/* { dg-options "-O2 -fipa-sra -fdump-ipa-sra -fdump-tree-optimized" } */
/* Testing removal of unused parameters in recursive calls. */
extern int work_1 (int);
extern int work_2 (int);
static int __attribute__((noinline))
foo (int l, int w1, int w2, int useless, int useless2);
static int __attribute__((noinline))
bar_1 (int l, int w1, int w2, int useless, int useless2)
{
return work_1 (w1) + foo (l, w1, w2, useless2, useless);
}
static int __attribute__((noinline))
baz_1 (int useless, int useless2, int l, int w1, int w2)
{
return bar_1 (l, w1, w2, useless, useless2);
}
static int __attribute__((noinline))
bax_1 (int l, int w1, int w2, int useless, int useless2)
{
return baz_1 (useless, useless2, l, w1, w2);
}
static int __attribute__((noinline))
bar_2 (int l, int w1, int w2, int useless, int useless2)
{
return foo (l, w1, w2, useless2 + 5, useless);
}
static int __attribute__((noinline))
baz_2 (int useless, int useless2, int l, int w1, int w2)
{
return bar_2 (l, w1, w2, useless, useless2);
}
static int __attribute__((noinline))
bax_2 (int l, int w1, int w2, int useless, int useless2)
{
return work_2 (w2) + baz_2 (useless, useless2, l, w1, w2);
}
static int __attribute__((noinline))
foo (int l, int w1, int w2, int useless, int useless2)
{
int r = 0;
if (!l)
return r;
if (l % 2)
r = bax_1 (l - 1, w1, w2, useless, useless2);
else
r = bax_2 (l - 1, w1, w2, useless, useless2);
return r;
}
int
entry (int l, int w1, int w2, int noneed, int noneed2)
{
return foo (l, w2, w2, noneed2, noneed2 + 4);
}
/* { dg-final { scan-ipa-dump-times "Will remove parameter" 14 "sra" } } */
/* { dg-final { scan-tree-dump-not "useless" "optimized"} } */