diff options
author | Jan Hubicka <jh@suse.cz> | 2007-02-25 19:11:20 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2007-02-25 18:11:20 +0000 |
commit | 2a025b54f6867e218f4ec07a70c57833162c0c32 (patch) | |
tree | 1a37d2e2bb52f60603e5c98e35b7b35011c5407c | |
parent | bd8d4d191780e0b944d5187129b8210d71c565ec (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/tree-inline.c | 15 |
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. |