aboutsummaryrefslogtreecommitdiff
path: root/gcc/cfgrtl.c
diff options
context:
space:
mode:
authorJames E Wilson <wilson@specifixinc.com>2005-10-17 17:22:53 -0700
committerJim Wilson <wilson@gcc.gnu.org>2005-10-17 17:22:53 -0700
commit1b2914a08690ba27783457d7ebe250afba9bd9f2 (patch)
treeed724d81437e2a094d7d1b08694e9eb665cee483 /gcc/cfgrtl.c
parent55ae1d648c1e23c4627716a0a83efb88f24ae32e (diff)
downloadgcc-1b2914a08690ba27783457d7ebe250afba9bd9f2.zip
gcc-1b2914a08690ba27783457d7ebe250afba9bd9f2.tar.gz
gcc-1b2914a08690ba27783457d7ebe250afba9bd9f2.tar.bz2
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
Diffstat (limited to 'gcc/cfgrtl.c')
-rw-r--r--gcc/cfgrtl.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c
index e39b196..00a219d4 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;