diff options
author | James E Wilson <wilson@specifixinc.com> | 2005-10-17 17:22:53 -0700 |
---|---|---|
committer | Jim Wilson <wilson@gcc.gnu.org> | 2005-10-17 17:22:53 -0700 |
commit | 1b2914a08690ba27783457d7ebe250afba9bd9f2 (patch) | |
tree | ed724d81437e2a094d7d1b08694e9eb665cee483 /gcc/cfgrtl.c | |
parent | 55ae1d648c1e23c4627716a0a83efb88f24ae32e (diff) | |
download | gcc-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.c | 16 |
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; |