diff options
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/tree-tailcall.c | 16 |
2 files changed, 21 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3ff14d4..ca5666d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2004-07-11 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz> + + PR tree-optimization/15654 + * tree-tailcall.c (eliminate_tail_call): Remove unreachable code. + 2004-07-11 Roger Sayle <roger@eyesopen.com> * builtins.c (fold_builtin_fputs): Don't bother converting the diff --git a/gcc/tree-tailcall.c b/gcc/tree-tailcall.c index 323c239..fdd010f 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) |