From 1b2914a08690ba27783457d7ebe250afba9bd9f2 Mon Sep 17 00:00:00 2001 From: James E Wilson Date: Mon, 17 Oct 2005 17:22:53 -0700 Subject: [PATCH] Fix IA-64 libada build failure, abnormal call edges on non-call insns. PR rtl-optimization/17356 * cfgrtl.c (purge_dead_edges): Check for EDGE_ABNORMAL_CALL before checking for EDGE_EH. From-SVN: r105533 --- gcc/ChangeLog | 6 ++++++ gcc/cfgrtl.c | 16 ++++++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c606f83e383..c7c6e6c1c6f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-10-17 James E Wilson + + PR rtl-optimization/17356 + * cfgrtl.c (purge_dead_edges): Check for EDGE_ABNORMAL_CALL before + checking for EDGE_EH. + 2005-10-17 Eric Botcazou * config/sparc/sparc.c (function_arg_slotno): In 64-bit mode, align diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c index e39b196be07..00a219d4802 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; -- 2.30.2