/* { 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"} } */