From bc470c243a8bbecdb92f2a7f4636f92db6fe0120 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Sun, 2 Jan 2011 18:07:15 +0100 Subject: [PATCH] re PR rtl-optimization/47028 (gcc.dg/tree-ssa/tailrecursion-[57].c FAIL with -foptimize-sibling-calls -fno-forward-propagate -fno-tree-copy-prop -fno-tree-dominator-opts) PR rtl-optimization/47028 * cfgexpand.c (gimple_expand_cfg): Insert entry edge insertions after parm_birth_insn instead of at the beginning of first bb. * gcc.dg/pr47028.c: New test. From-SVN: r168401 --- gcc/ChangeLog | 7 +++++++ gcc/cfgexpand.c | 14 +++++++++++++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr47028.c | 19 +++++++++++++++++++ 4 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/pr47028.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9a793f41d2d2..343e51056f02 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2011-01-02 Jakub Jelinek + + PR rtl-optimization/47028 + * cfgexpand.c (gimple_expand_cfg): Insert entry edge + insertions after parm_birth_insn instead of at the beginning + of first bb. + 2011-01-02 Mingjie Xing * doc/generic.texi: Remove duplicated "@subsubsection Statements". diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index a3940d01775f..13c63be12ef8 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -4085,7 +4085,19 @@ gimple_expand_cfg (void) for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); ) { if (e->insns.r) - commit_one_edge_insertion (e); + { + /* Avoid putting insns before parm_birth_insn. */ + if (e->src == ENTRY_BLOCK_PTR + && single_succ_p (ENTRY_BLOCK_PTR) + && parm_birth_insn) + { + rtx insns = e->insns.r; + e->insns.r = NULL_RTX; + emit_insn_after_noloc (insns, parm_birth_insn, e->dest); + } + else + commit_one_edge_insertion (e); + } else ei_next (&ei); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3ba534674fe0..09e47cfca258 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-01-02 Jakub Jelinek + + PR rtl-optimization/47028 + * gcc.dg/pr47028.c: New test. + 2011-01-02 Nicola Pero * objc.dg/protocol-forward-1.m: Removed TODO. diff --git a/gcc/testsuite/gcc.dg/pr47028.c b/gcc/testsuite/gcc.dg/pr47028.c new file mode 100644 index 000000000000..3f80ff1c5e75 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr47028.c @@ -0,0 +1,19 @@ +/* PR rtl-optimization/47028 */ +/* { dg-do run } */ +/* { dg-options "-O -foptimize-sibling-calls -fno-forward-propagate -fno-tree-copy-prop -fno-tree-dominator-opts" } */ + +int +fib (int n) +{ + if (n <= 1) + return 1; + return fib (n - 2) + fib (n - 1); +} + +int +main (void) +{ + if (fib (5) != 8) + __builtin_abort (); + return 0; +}