aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Haley <aph@redhat.com>2006-07-17 13:14:38 +0000
committerAndrew Haley <aph@gcc.gnu.org>2006-07-17 13:14:38 +0000
commit9d335249c9fe3535dfbb0af94617d32890d74702 (patch)
tree5acb9fdfd81d8a472fa93bbc16a1bc890b6adc3f
parent2b65dae54e6e0eb0a30d645d516a7006d50e321b (diff)
downloadgcc-9d335249c9fe3535dfbb0af94617d32890d74702.zip
gcc-9d335249c9fe3535dfbb0af94617d32890d74702.tar.gz
gcc-9d335249c9fe3535dfbb0af94617d32890d74702.tar.bz2
re PR tree-optimization/19505 (java bytecode to native ICE in remove_unreachable_regions)
2006-07-13 Andrew Haley <aph@redhat.com> PR tree-optimization/19505 * tree-cfgcleanup.c (tree_forwarder_block_p): If we have an EH edge leaving this block, make sure that the destination of this block has only one predecessor. From-SVN: r115518
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/tree-cfgcleanup.c19
2 files changed, 26 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8c6048b..0ff6fa3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2006-07-13 Andrew Haley <aph@redhat.com>
+
+ PR tree-optimization/19505
+ * tree-cfgcleanup.c (tree_forwarder_block_p): If we have an EH
+ edge leaving this block, make sure that the destination of this
+ block has only one predecessor.
+
2006-07-17 Richard Guenther <rguenther@suse.de>
PR tree-optimization/28238
diff --git a/gcc/tree-cfgcleanup.c b/gcc/tree-cfgcleanup.c
index ab452c4..be90209 100644
--- a/gcc/tree-cfgcleanup.c
+++ b/gcc/tree-cfgcleanup.c
@@ -239,6 +239,9 @@ static bool
tree_forwarder_block_p (basic_block bb, bool phi_wanted)
{
block_stmt_iterator bsi;
+ edge_iterator ei;
+ edge e, succ;
+ basic_block dest;
/* BB must have a single outgoing edge. */
if (single_succ_p (bb) != 1
@@ -290,6 +293,22 @@ tree_forwarder_block_p (basic_block bb, bool phi_wanted)
return false;
}
+ /* If we have an EH edge leaving this block, make sure that the
+ destination of this block has only one predecessor. This ensures
+ that we don't get into the situation where we try to remove two
+ forwarders that go to the same basic block but are handlers for
+ different EH regions. */
+ succ = single_succ_edge (bb);
+ dest = succ->dest;
+ FOR_EACH_EDGE (e, ei, bb->preds)
+ {
+ if (e->flags & EDGE_EH)
+ {
+ if (!single_pred_p (dest))
+ return false;
+ }
+ }
+
return true;
}