diff options
author | Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz> | 2004-07-11 21:57:47 +0200 |
---|---|---|
committer | Zdenek Dvorak <rakdver@gcc.gnu.org> | 2004-07-11 19:57:47 +0000 |
commit | 8d3d51b52c6640139d52c5967b804d229b153bf9 (patch) | |
tree | 3053fd7033c9fa15e5dc48ee261f16909ec7260e /gcc/tree-tailcall.c | |
parent | 6f4229658a77a80aedbe50f435ea8c693e745583 (diff) | |
download | gcc-8d3d51b52c6640139d52c5967b804d229b153bf9.tar.gz |
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
Diffstat (limited to 'gcc/tree-tailcall.c')
-rw-r--r-- | gcc/tree-tailcall.c | 16 |
1 files changed, 16 insertions, 0 deletions
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) |