diff options
author | Geoff Keating <geoffk@cygnus.com> | 2000-10-23 18:42:52 +0000 |
---|---|---|
committer | Geoffrey Keating <geoffk@gcc.gnu.org> | 2000-10-23 18:42:52 +0000 |
commit | 96af667a5e7aa8909958c4c59b8672fc93d24799 (patch) | |
tree | 888ef45583d24a7d5f9aed639416b2cda4936a27 /gcc | |
parent | ea343d1a913bdac775bb5649b0c7546542206aad (diff) | |
download | gcc-96af667a5e7aa8909958c4c59b8672fc93d24799.zip gcc-96af667a5e7aa8909958c4c59b8672fc93d24799.tar.gz gcc-96af667a5e7aa8909958c4c59b8672fc93d24799.tar.bz2 |
local-alloc.c (update_equiv_regs): Add an abort().
* local-alloc.c (update_equiv_regs): Add an abort(). When
deleting or moving insns, update reg_equiv[regno].init_insns.
From-SVN: r37018
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/local-alloc.c | 12 |
2 files changed, 16 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c3941b4..8a97f07 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2000-10-23 Geoff Keating <geoffk@cygnus.com> + + * local-alloc.c (update_equiv_regs): Add an abort(). When + deleting or moving insns, update reg_equiv[regno].init_insns. + 2000-10-23 Mark Mitchell <mark@codesourcery.com> * c-tree.texi: Improve documentation for IF_STMTs and related diff --git a/gcc/local-alloc.c b/gcc/local-alloc.c index d581d5c..2d7cac8 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; |