aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/cfgrtl.c52
-rw-r--r--gcc/config/i386/i386.h2
3 files changed, 32 insertions, 29 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d757905..165147b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+Don Feb 28 11:24:30 CET 2002 Jan Hubicka <jh@suse.cz>
+
+ * 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 <jh@suse.cz>
* basic-block.h (BB_REACHABLE): Renumber.
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
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index 342105d..63dae01 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; \