This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch RFA] Avoid another invalid RTL sharing


Hi,

The attached patch is to avoid another invalid RTL sharing found
with Honza's RTL sharing verifier during the builds on some
embedded targets.  The patch itself is same as in
http://gcc.gnu.org/ml/gcc-patches/2006-11/msg00712.html
Now it's tested with bootstrap and the top level "make -k check"
on i686-pc-linux-gnu with no new failures.

Regards,
	kaz
--
2006-11-11  Kaz Kojima  <kkojima@gcc.gnu.org>

	* genemit.c (gen_insn): Call gen_exp with a non-null used
	when handling multiple insns.
	(gen_expand): Likewise.
	* reorg.c (emit_delay_sequence): Copy the delay slot insn.
	* config/sh/sh.md (ashrsi2_31+1): Copy operands[0].
	(movsi_const_16bit+1): Copy operands[1].
	(call_pcrel): Copy the call_site pattern.
	(call_value_pcrel, sibcall_pcrel, GOTaddr2picreg): Likewise.

diff -uprN ORIG/trunk/gcc/genemit.c LOCAL/trunk/gcc/genemit.c
--- ORIG/trunk/gcc/genemit.c	2006-03-30 22:21:21.000000000 +0900
+++ LOCAL/trunk/gcc/genemit.c	2006-11-11 20:17:26.000000000 +0900
@@ -428,15 +428,18 @@ gen_insn (rtx insn, int lineno)
     }
   else
     {
+      char *used = XCNEWVEC (char, operands);
+
       printf ("  return gen_rtx_PARALLEL (VOIDmode, gen_rtvec (%d",
 	      XVECLEN (insn, 1));
 
       for (i = 0; i < XVECLEN (insn, 1); i++)
 	{
 	  printf (",\n\t\t");
-	  gen_exp (XVECEXP (insn, 1, i), DEFINE_INSN, NULL);
+	  gen_exp (XVECEXP (insn, 1, i), DEFINE_INSN, used);
 	}
       printf ("));\n}\n\n");
+      free (used);
     }
 }
 
@@ -447,6 +450,7 @@ gen_expand (rtx expand)
 {
   int operands;
   int i;
+  char *used;
 
   if (strlen (XSTR (expand, 0)) == 0)
     fatal ("define_expand lacks a name");
@@ -530,6 +534,8 @@ gen_expand (rtx expand)
      Use emit_insn to add them to the sequence being accumulated.
      But don't do this if the user's code has set `no_more' nonzero.  */
 
+  used = XCNEWVEC (char, operands);
+
   for (i = 0; i < XVECLEN (expand, 1); i++)
     {
       rtx next = XVECEXP (expand, 1, i);
@@ -560,13 +566,15 @@ gen_expand (rtx expand)
 	printf ("  emit (");
       else
 	printf ("  emit_insn (");
-      gen_exp (next, DEFINE_EXPAND, NULL);
+      gen_exp (next, DEFINE_EXPAND, used);
       printf (");\n");
       if (GET_CODE (next) == SET && GET_CODE (SET_DEST (next)) == PC
 	  && GET_CODE (SET_SRC (next)) == LABEL_REF)
 	printf ("  emit_barrier ();");
     }
 
+  free (used);
+
   /* Call `get_insns' to extract the list of all the
      insns emitted within this gen_... function.  */
 
diff -uprN ORIG/trunk/gcc/reorg.c LOCAL/trunk/gcc/reorg.c
--- ORIG/trunk/gcc/reorg.c	2006-08-17 07:47:33.000000000 +0900
+++ LOCAL/trunk/gcc/reorg.c	2006-11-11 20:17:26.000000000 +0900
@@ -513,7 +513,7 @@ emit_delay_sequence (rtx insn, rtx list,
 
   for (li = list; li; li = XEXP (li, 1), i++)
     {
-      rtx tem = XEXP (li, 0);
+      rtx tem = copy_rtx (XEXP (li, 0));
       rtx note, next;
 
       /* Show that this copy of the insn isn't deleted.  */
diff -uprN ORIG/trunk/gcc/config/sh/sh.md LOCAL/trunk/gcc/config/sh/sh.md
--- ORIG/trunk/gcc/config/sh/sh.md	2006-11-05 10:02:45.000000000 +0900
+++ LOCAL/trunk/gcc/config/sh/sh.md	2006-11-11 20:17:26.000000000 +0900
@@ -3752,7 +3752,7 @@ label:
   "
 {
   emit_insn (gen_ashlsi_c (operands[0], operands[1]));
-  emit_insn (gen_mov_neg_si_t (operands[0]));
+  emit_insn (gen_mov_neg_si_t (copy_rtx (operands[0])));
   DONE;
 }")
 
@@ -5113,7 +5113,7 @@ label:
 {
   rtx insn = emit_insn (gen_movsi_const (operands[0], operands[1]));
 
-  REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EQUAL, operands[1],
+  REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EQUAL, copy_rtx (operands[1]),
 					REG_NOTES (insn));
 
   DONE;
@@ -5497,7 +5497,7 @@ label:
   else
     insn = emit_insn (gen_movdi_const_32bit (operands[0], operands[1]));
 
-  REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EQUAL, operands[1],
+  REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EQUAL, copy_rtx (operands[1]),
 					REG_NOTES (insn));
 
   DONE;
@@ -7390,7 +7390,7 @@ label:
     emit_insn (gen_sym_label2reg (operands[2], operands[0], lab));
   else
     emit_insn (gen_symPLT_label2reg (operands[2], operands[0], lab));
-  emit_call_insn (gen_calli_pcrel (operands[2], operands[1], lab));
+  emit_call_insn (gen_calli_pcrel (operands[2], operands[1], copy_rtx (lab)));
   DONE;
 }"
   [(set_attr "type" "call")
@@ -7494,7 +7494,7 @@ label:
   else
     emit_insn (gen_symPLT_label2reg (operands[3], operands[1], lab));
   emit_call_insn (gen_call_valuei_pcrel (operands[0], operands[3],
-					 operands[2], lab));
+					 operands[2], copy_rtx (lab)));
   DONE;
 }"
   [(set_attr "type" "call")
@@ -7875,7 +7875,7 @@ label:
 
   emit_insn (gen_sym_label2reg (operands[2], operands[0], lab));
   call_insn = emit_call_insn (gen_sibcalli_pcrel (operands[2], operands[1],
-						  lab));
+						  copy_rtx (lab)));
   SIBLING_CALL_P (call_insn) = 1;
   DONE;
 }"
@@ -8313,12 +8313,12 @@ label:
       if (Pmode == SImode)
 	{
 	  emit_insn (gen_movsi_const (pic, operands[1]));
-	  emit_insn (gen_ptrel_si (tr, pic, lab));
+	  emit_insn (gen_ptrel_si (tr, pic, copy_rtx (lab)));
 	}
       else
 	{
 	  emit_insn (gen_movdi_const (pic, operands[1]));
-	  emit_insn (gen_ptrel_di (tr, pic, lab));
+	  emit_insn (gen_ptrel_di (tr, pic, copy_rtx (lab)));
 	}
 
       insn = emit_move_insn (operands[0], tr);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]