From 70da1d030dfa76bd605100e3969df62b6aaa2512 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Thu, 28 Feb 2002 11:03:16 +0000 Subject: cfgrtl.c (purge_dead_edges): Fix handling of EH edges. * cfgrtl.c (purge_dead_edges): Fix handling of EH edges. * i386.h (CONDITIONAL_REGISTER_USAGE): Do not write to PIC_OFFSET_TABLE_REGNUM when it is INVALID_REGNUM From-SVN: r50128 --- gcc/cfgrtl.c | 52 ++++++++++++++++++++++++---------------------------- 1 file changed, 24 insertions(+), 28 deletions(-) (limited to 'gcc/cfgrtl.c') diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c index 1b00a61..a45d4a3 100644 --- a/gcc/cfgrtl.c +++ b/gcc/cfgrtl.c @@ -1899,9 +1899,30 @@ purge_dead_edges (bb) rtx insn = bb->end, note; bool purged = false; - /* ??? This makes no sense since the later test includes more cases. */ - if (GET_CODE (insn) == JUMP_INSN && !simplejump_p (insn)) - return false; + /* If this instruction cannot trap, remove REG_EH_REGION notes. */ + if (GET_CODE (insn) == INSN + && (note = find_reg_note (insn, REG_EH_REGION, NULL))) + { + rtx eqnote; + + if (! may_trap_p (PATTERN (insn)) + || ((eqnote = find_reg_equal_equiv_note (insn)) + && ! may_trap_p (XEXP (eqnote, 0)))) + remove_note (insn, note); + } + + /* Cleanup abnormal edges caused by throwing insns that have been + eliminated. */ + if (! can_throw_internal (bb->end)) + for (e = bb->succ; e; e = next) + { + next = e->succ_next; + if (e->flags & EDGE_EH) + { + remove_edge (e); + purged = true; + } + } if (GET_CODE (insn) == JUMP_INSN) { @@ -1970,31 +1991,6 @@ purge_dead_edges (bb) return purged; } - /* If this instruction cannot trap, remove REG_EH_REGION notes. */ - if (GET_CODE (insn) == INSN - && (note = find_reg_note (insn, REG_EH_REGION, NULL))) - { - rtx eqnote; - - if (! may_trap_p (PATTERN (insn)) - || ((eqnote = find_reg_equal_equiv_note (insn)) - && ! may_trap_p (XEXP (eqnote, 0)))) - remove_note (insn, note); - } - - /* Cleanup abnormal edges caused by throwing insns that have been - eliminated. */ - if (! can_throw_internal (bb->end)) - for (e = bb->succ; e; e = next) - { - next = e->succ_next; - if (e->flags & EDGE_EH) - { - remove_edge (e); - purged = true; - } - } - /* If we don't see a jump insn, we don't know exactly why the block would have been broken at this point. Look for a simple, non-fallthru edge, as these are only created by conditional branches. If we find such an -- cgit v1.1