From 8d3d51b52c6640139d52c5967b804d229b153bf9 Mon Sep 17 00:00:00 2001 From: Zdenek Dvorak Date: Sun, 11 Jul 2004 21:57:47 +0200 Subject: [PATCH] re PR tree-optimization/15654 (ICE in calculate_live_on_entry with -O2 -fno-tree-dominator-opts) PR tree-optimization/15654 * tree-tailcall.c (eliminate_tail_call): Remove unreachable code. From-SVN: r84527 --- gcc/ChangeLog | 5 +++++ gcc/tree-tailcall.c | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3ff14d40a3a..ca5666d00d8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2004-07-11 Zdenek Dvorak + + PR tree-optimization/15654 + * tree-tailcall.c (eliminate_tail_call): Remove unreachable code. + 2004-07-11 Roger Sayle * builtins.c (fold_builtin_fputs): Don't bother converting the diff --git a/gcc/tree-tailcall.c b/gcc/tree-tailcall.c index 323c239cece..fdd010f160c 100644 --- a/gcc/tree-tailcall.c +++ b/gcc/tree-tailcall.c @@ -647,6 +647,7 @@ eliminate_tail_call (struct tailcall *t) stmt_ann_t ann; v_may_def_optype v_may_defs; unsigned i; + block_stmt_iterator bsi; stmt = bsi_stmt (t->call_bsi); get_stmt_operands (stmt); @@ -666,6 +667,21 @@ eliminate_tail_call (struct tailcall *t) first = ENTRY_BLOCK_PTR->succ->dest; + /* Remove the code after call_bsi that will become unreachable. The + possibly unreachable code in other blocks is removed later in + cfg cleanup. */ + bsi = t->call_bsi; + bsi_next (&bsi); + while (!bsi_end_p (bsi)) + { + /* Do not remove the return statement, so that redirect_edge_and_branch + sees how the block ends. */ + if (TREE_CODE (bsi_stmt (bsi)) == RETURN_EXPR) + break; + + bsi_remove (&bsi); + } + /* Replace the call by a jump to the start of function. */ e = redirect_edge_and_branch (t->call_block->succ, first); if (!e) -- 2.30.2