local-alloc.c (update_equiv_regs): Add an abort().
authorGeoff Keating <geoffk@cygnus.com>
Mon, 23 Oct 2000 18:42:52 +0000 (18:42 +0000)
committerGeoffrey Keating <geoffk@gcc.gnu.org>
Mon, 23 Oct 2000 18:42:52 +0000 (18:42 +0000)
* local-alloc.c (update_equiv_regs): Add an abort().  When
deleting or moving insns, update reg_equiv[regno].init_insns.

From-SVN: r37018

gcc/ChangeLog
gcc/local-alloc.c

index c3941b4442b911073bd7e2449c5f0d030640791e..8a97f077e584896e3616afeac3091588b0ed3d1e 100644 (file)
@@ -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
index d581d5c96be61a143f618e5efb5fc83f36846d44..2d7cac8f01f4cdbc4cc0abec19995ff7f5310ca7 100644 (file)
@@ -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;