aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/cfgrtl.c16
2 files changed, 16 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c606f83..c7c6e6c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2005-10-17 James E Wilson <wilson@specifix.com>
+
+ PR rtl-optimization/17356
+ * cfgrtl.c (purge_dead_edges): Check for EDGE_ABNORMAL_CALL before
+ checking for EDGE_EH.
+
2005-10-17 Eric Botcazou <ebotcazou@libertysurf.fr>
* config/sparc/sparc.c (function_arg_slotno): In 64-bit mode, align
diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c
index e39b196..00a219d 100644
--- a/gcc/cfgrtl.c
+++ b/gcc/cfgrtl.c
@@ -2300,19 +2300,23 @@ purge_dead_edges (basic_block bb)
/* Cleanup abnormal edges caused by exceptions or non-local gotos. */
for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
{
- if (e->flags & EDGE_EH)
+ /* We must check for the most restrictive condition first. Since
+ an abnormal call edge is always an EH edge, but an EH edge is not
+ always an abnormal call edge, we must check for an abnormal call
+ edge first. */
+ if (e->flags & EDGE_ABNORMAL_CALL)
{
- if (can_throw_internal (BB_END (bb)))
+ if (CALL_P (BB_END (bb))
+ && (! (note = find_reg_note (insn, REG_EH_REGION, NULL))
+ || INTVAL (XEXP (note, 0)) >= 0))
{
ei_next (&ei);
continue;
}
}
- else if (e->flags & EDGE_ABNORMAL_CALL)
+ else if (e->flags & EDGE_EH)
{
- if (CALL_P (BB_END (bb))
- && (! (note = find_reg_note (insn, REG_EH_REGION, NULL))
- || INTVAL (XEXP (note, 0)) >= 0))
+ if (can_throw_internal (BB_END (bb)))
{
ei_next (&ei);
continue;