Rewrite fix for PR 17356, fix for enable checking ada build failure.

cfgrtl.c (purge_dead_edges): Undo last change.  In EDGE_EH code,
add check for CALL_INSN if EDGE_ABRNOMAL_CALL true.

From-SVN: r106297
This commit is contained in:
James E Wilson 2005-10-31 15:24:36 -08:00 committed by Jim Wilson
parent d63f0fe58a
commit e5f9a909f1
2 changed files with 18 additions and 10 deletions

View File

@ -1,3 +1,9 @@
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

View File

@ -2294,23 +2294,25 @@ 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)); )
{
/* 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;