From 70da1d030dfa76bd605100e3969df62b6aaa2512 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Thu, 28 Feb 2002 11:03:16 +0000 Subject: [PATCH] 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/ChangeLog | 7 ++++++ gcc/cfgrtl.c | 52 +++++++++++++++++++----------------------- gcc/config/i386/i386.h | 2 +- 3 files changed, 32 insertions(+), 29 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d757905eb2e..165147b84af 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +Don Feb 28 11:24:30 CET 2002 Jan Hubicka + + * 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 + Don Feb 28 11:07:36 CET 2002 Jan Hubicka * basic-block.h (BB_REACHABLE): Renumber. diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c index 1b00a61285c..a45d4a37f7e 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 diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index 342105d586d..63dae0122ef 100644 --- a/gcc/config/i386/i386.h +++ b/gcc/config/i386/i386.h @@ -957,7 +957,7 @@ do { \ call_used_regs[i] = (call_used_regs[i] \ & (TARGET_64BIT ? 2 : 1)) != 0; \ } \ - if (flag_pic) \ + if (flag_pic && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM) \ { \ fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \ call_used_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \