aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2007-02-25 19:11:20 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2007-02-25 18:11:20 +0000
commit2a025b54f6867e218f4ec07a70c57833162c0c32 (patch)
tree1a37d2e2bb52f60603e5c98e35b7b35011c5407c
parentbd8d4d191780e0b944d5187129b8210d71c565ec (diff)
downloadgcc-2a025b54f6867e218f4ec07a70c57833162c0c32.zip
gcc-2a025b54f6867e218f4ec07a70c57833162c0c32.tar.gz
gcc-2a025b54f6867e218f4ec07a70c57833162c0c32.tar.bz2
re PR middle-end/30509 (ice for legal code with -O3)
PR middle-end/30509 * tree-inline.c (copy_bb): Produce exact copy of EH info when copying for inlining. From-SVN: r122314
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/tree-inline.c15
2 files changed, 19 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6aa21b5..cc9e79e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2007-02-24 Jan Hubicka <jh@suse.cz>
+
+ PR middle-end/30509
+ * tree-inline.c (copy_bb): Produce exact copy of EH info when copying for inlining.
+
2007-02-24 Uros Bizjak <ubizjak@gmail.com>
Jan Hubicka <jh@suse.cz>
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index 27d985e..349d109 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -873,7 +873,20 @@ copy_bb (copy_body_data *id, basic_block bb, int frequency_scale, int count_scal
gcc_assert (lookup_stmt_eh_region_fn (id->src_cfun, orig_stmt)
!= 0);
- if (tree_could_throw_p (stmt))
+ if (tree_could_throw_p (stmt)
+ /* When we are cloning for inlining, we are supposed to
+ construct a clone that calls precisely the same functions
+ as original. However IPA optimizers might've proved
+ earlier some function calls as non-trapping that might
+ render some basic blocks dead that might become
+ unreachable.
+
+ We can't update SSA with unreachable blocks in CFG and thus
+ we prevent the scenario by preserving even the "dead" eh
+ edges until the point they are later removed by
+ fixup_cfg pass. */
+ || (id->transform_call_graph_edges == CB_CGE_MOVE_CLONES
+ && lookup_stmt_eh_region_fn (id->src_cfun, orig_stmt) > 0))
{
int region = lookup_stmt_eh_region_fn (id->src_cfun, orig_stmt);
/* Add an entry for the copied tree in the EH hashtable.