+2005-10-25 James E. Wilson <wilson@specifix.com>
+
+ PR rtl-optimization/17356
+ * cfgrtl.c (purge_dead_edges): Undo last change. In EDGE_EH code,
+ add check for CALL_INSN if EDGE_ABRNOMAL_CALL true.
+
2005-10-31 Jan Hubicka <jh@suse.cz>
PR middle-end/24093
/* Cleanup abnormal edges caused by exceptions or non-local gotos. */
for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
{
- /* 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)
+ /* There are three types of edges we need to handle correctly here: EH
+ edges, abnormal call EH edges, and abnormal call non-EH edges. The
+ latter can appear when nonlocal gotos are used. */
+ 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))
+ /* If this is a call edge, verify that this is a call insn. */
+ && (! (e->flags & EDGE_ABNORMAL_CALL)
+ || CALL_P (BB_END (bb))))
{
ei_next (&ei);
continue;
}
}
- else if (e->flags & EDGE_EH)
+ else 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;