This fixes a segfault seen in the fix-vr4130* cases when run with
-O3 -mabi=64.  The problem was caused by vr4130_align_insns simulating
zero-length ghost gp instructions, even though the idea is that the
scheduler should ignore them.  (These instructions postdate the vr4130
stuff by quite some time.)

Tested on mips64-linux-gnu.  Applied.

Richard


gcc/
        * config/mips/mips.c (vr4130_align_insns): Don't simulate
        ghost instructions.  Assert that the required instructions exist.

Index: gcc/config/mips/mips.c
===================================================================
--- gcc/config/mips/mips.c      2012-08-27 16:28:48.068139755 +0100
+++ gcc/config/mips/mips.c      2012-08-27 16:54:59.941094052 +0100
@@ -15145,7 +15145,8 @@ vr4130_align_insns (void)
         the fly to avoid a separate instruction walk.  */
       vr4130_avoid_branch_rt_conflict (insn);
 
-      if (USEFUL_INSN_P (insn))
+      length = get_attr_length (insn);
+      if (length > 0 && USEFUL_INSN_P (insn))
        FOR_EACH_SUBINSN (subinsn, insn)
          {
            mips_sim_wait_insn (&state, subinsn);
@@ -15180,6 +15181,7 @@ vr4130_align_insns (void)
                       issuing at the same time as the branch.  We therefore
                       insert a nop before the branch in order to align its
                       delay slot.  */
+                   gcc_assert (last2);
                    emit_insn_after (gen_nop (), last2);
                    aligned_p = false;
                  }
@@ -15188,6 +15190,7 @@ vr4130_align_insns (void)
                    /* SUBINSN is the delay slot of INSN, but INSN is
                       currently unaligned.  Insert a nop between
                       LAST and INSN to align it.  */
+                   gcc_assert (last);
                    emit_insn_after (gen_nop (), last);
                    aligned_p = true;
                  }

Reply via email to