Patchwork [MIPS,committed] Fix segfault in vr4130_align_insns

login
register
mail settings
Submitter Richard Sandiford
Date Aug. 27, 2012, 4:25 p.m.
Message ID <87oblw1evi.fsf@talisman.home>
Download mbox | patch
Permalink /patch/180244/
State New
Headers show

Comments

Richard Sandiford - Aug. 27, 2012, 4:25 p.m.
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.

Patch

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;
 		  }