summaryrefslogtreecommitdiff
path: root/gcc/local-alloc.c
diff options
context:
space:
mode:
authorgeoffk <geoffk@138bc75d-0d04-0410-961f-82ee72b054a4>2000-10-23 18:42:52 +0000
committergeoffk <geoffk@138bc75d-0d04-0410-961f-82ee72b054a4>2000-10-23 18:42:52 +0000
commit3d09fb3bcf2d52902ac507192330039eeaca5c90 (patch)
tree888ef45583d24a7d5f9aed639416b2cda4936a27 /gcc/local-alloc.c
parent8f2b45d476e8ac3fb1c07b87f926f3a9491dc64e (diff)
downloadgcc-3d09fb3bcf2d52902ac507192330039eeaca5c90.tar.gz
* local-alloc.c (update_equiv_regs): Add an abort(). When
deleting or moving insns, update reg_equiv[regno].init_insns. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@37018 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/local-alloc.c')
-rw-r--r--gcc/local-alloc.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/gcc/local-alloc.c b/gcc/local-alloc.c
index d581d5c96be..2d7cac8f01f 100644
--- a/gcc/local-alloc.c
+++ b/gcc/local-alloc.c
@@ -1088,6 +1088,9 @@ update_equiv_regs ()
once and used once. (If it were only set, but not used,
flow would have deleted the setting insns.) Hence
there can only be one insn in reg_equiv[REGNO].init_insns. */
+ if (reg_equiv[regno].init_insns == NULL_RTX
+ || XEXP (reg_equiv[regno].init_insns, 1) != NULL_RTX)
+ abort ();
equiv_insn = XEXP (reg_equiv[regno].init_insns, 0);
if (asm_noperands (PATTERN (equiv_insn)) < 0
@@ -1123,14 +1126,19 @@ update_equiv_regs ()
PUT_CODE (equiv_insn, NOTE);
NOTE_LINE_NUMBER (equiv_insn) = NOTE_INSN_DELETED;
NOTE_SOURCE_FILE (equiv_insn) = 0;
+
+ reg_equiv[regno].init_insns =
+ XEXP (reg_equiv[regno].init_insns, 1);
}
/* Move the initialization of the register to just before
INSN. Update the flow information. */
else if (PREV_INSN (insn) != equiv_insn)
{
int l;
+ rtx new_insn;
- emit_insn_before (copy_rtx (PATTERN (equiv_insn)), insn);
+ new_insn = emit_insn_before (copy_rtx (PATTERN (equiv_insn)),
+ insn);
REG_NOTES (PREV_INSN (insn)) = REG_NOTES (equiv_insn);
REG_NOTES (equiv_insn) = 0;
@@ -1138,6 +1146,8 @@ update_equiv_regs ()
NOTE_LINE_NUMBER (equiv_insn) = NOTE_INSN_DELETED;
NOTE_SOURCE_FILE (equiv_insn) = 0;
+ XEXP (reg_equiv[regno].init_insns, 0) = new_insn;
+
REG_BASIC_BLOCK (regno) = block >= 0 ? block : 0;
REG_N_CALLS_CROSSED (regno) = 0;
REG_LIVE_LENGTH (regno) = 2;