From: Zdenek Dvorak Date: Sat, 7 May 2011 19:43:18 +0000 (+0200) Subject: re PR tree-optimization/48837 (Wrong optimization of recursive function calls) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=1400c8e5013a0901298b3adfeb9c5dbfcef2f494;p=gcc.git re PR tree-optimization/48837 (Wrong optimization of recursive function calls) PR tree-optimization/48837 * tree-tailcall.c (tree_optimize_tail_calls_1): Do not mark tailcalls when accumulator transformation is performed. * gcc.dg/pr48837.c: New testcase. From-SVN: r173534 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6534bbc46eb..a3f6a111463 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-05-07 Zdenek Dvorak + + PR tree-optimization/48837 + * tree-tailcall.c (tree_optimize_tail_calls_1): Do not mark tailcalls + when accumulator transformation is performed. + 2011-05-06 Jan Hubicka * i386.h (ix86_tune_indices): Add X86_TUNE_SOFTWARE_PREFETCHING_BENEFICIAL. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ea142c2e956..735ac689dd3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-05-07 Zdenek Dvorak + + PR tree-optimization/48837 + * gcc.dg/pr48837.c: New testcase. + 2011-05-06 Jason Merrill * g++.dg/cpp0x/constexpr-condition2.C: New. diff --git a/gcc/testsuite/gcc.dg/pr48837.c b/gcc/testsuite/gcc.dg/pr48837.c new file mode 100644 index 00000000000..ffc65b9dc8c --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr48837.c @@ -0,0 +1,30 @@ +/* PR tree-optimization/48837 */ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +void abort (void); + +__attribute__((noinline)) +int baz(void) +{ + return 1; +} + +inline const int *bar(const int *a, const int *b) +{ + return *a ? a : b; +} + +int foo(int a, int b) +{ + return a || b ? baz() : foo(*bar(&a, &b), 1) + foo(1, 0); +} + +int main(void) +{ + if (foo(0, 0) != 2) + abort(); + + return 0; +} + diff --git a/gcc/tree-tailcall.c b/gcc/tree-tailcall.c index c94d6ca824b..6a2308028bb 100644 --- a/gcc/tree-tailcall.c +++ b/gcc/tree-tailcall.c @@ -1021,6 +1021,14 @@ tree_optimize_tail_calls_1 (bool opt_tailcalls) integer_one_node); } + if (a_acc || m_acc) + { + /* When the tail call elimination using accumulators is performed, + statements adding the accumulated value are inserted at all exits. + This turns all other tail calls to non-tail ones. */ + opt_tailcalls = false; + } + for (; tailcalls; tailcalls = next) { next = tailcalls->next;