]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
haifa-sched.c (create_reg_dead_note): Detect and handle another case where we kill...
authorJeff Law <law@gcc.gnu.org>
Mon, 22 Dec 1997 08:55:43 +0000 (01:55 -0700)
committerJeff Law <law@gcc.gnu.org>
Mon, 22 Dec 1997 08:55:43 +0000 (01:55 -0700)
        * haifa-sched.c (create_reg_dead_note): Detect and handle another
        case where we kill more regs after sched than were killed before
        sched.
        * sched.c (create_reg_dead_note): Similarly.

[[Split portion of a mixed commit.]]

From-SVN: r17182.1

gcc/haifa-sched.c
gcc/sched.c

index 59a1190ccb044b2e418c36e387b359a64d2d42eb..706e585490b38fb6e94ad3835884a72df1328705 100644 (file)
@@ -4462,6 +4462,23 @@ create_reg_dead_note (reg, insn)
       while (reg_note_regs < regs_killed)
        {
          link = XEXP (link, 1);
+
+         /* LINK might be zero if we killed more registers after scheduling
+            than before, and the last hard register we kill is actually
+            multiple hard regs. 
+
+            This is normal for interblock scheduling, so deal with it in
+            that case, else abort.  */
+         if (link == NULL_RTX && current_nr_blocks <= 1)
+           abort ();
+         else if (link == NULL_RTX)
+           {
+             link = rtx_alloc (EXPR_LIST);
+             PUT_REG_NOTE_KIND (link, REG_DEAD);
+             XEXP (link, 0) = gen_rtx (REG, word_mode, 0);
+             XEXP (link, 1) = NULL_RTX;
+           }
+            
          reg_note_regs += (REGNO (XEXP (link, 0)) >= FIRST_PSEUDO_REGISTER ? 1
                            : HARD_REGNO_NREGS (REGNO (XEXP (link, 0)),
                                                GET_MODE (XEXP (link, 0))));
index b81532425742c785d59b708d7b31b73b51d8a173..6e9f95645c62c649e4c3a5678e3d0fc22c307680 100644 (file)
@@ -2208,6 +2208,12 @@ create_reg_dead_note (reg, insn)
                                           GET_MODE (XEXP (link, 0))));
       while (reg_note_regs < regs_killed)
        {
+         /* LINK might be zero if we killed more registers after scheduling
+            than before, and the last hard register we kill is actually
+            multiple hard regs.  */
+         if (link == NULL_RTX)
+           abort ();
+  
          link = XEXP (link, 1);
          reg_note_regs += (REGNO (XEXP (link, 0)) >= FIRST_PSEUDO_REGISTER ? 1
                            : HARD_REGNO_NREGS (REGNO (XEXP (link, 0)),