* genemit.c (gen_insn): Call gen_exp with a non-null used
authorkkojima <kkojima@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 13 Nov 2006 03:28:13 +0000 (03:28 +0000)
committerkkojima <kkojima@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 13 Nov 2006 03:28:13 +0000 (03:28 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@118746 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/sh/sh.md
gcc/genemit.c
gcc/reorg.c

index 2a0318a..6865d82 100644 (file)
@@ -1,3 +1,14 @@
+2006-11-12  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.
+
 2006-11-12  Roger Sayle  <roger@eyesopen.com>
 
        * fold-const.c (negate_expr_p) <PLUS_EXPR, MINUS_EXPR>: Correct/refine
index a37c583..ab9a3b4 100644 (file)
@@ -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 79db84e..a1ebcf6 100644 (file)
@@ -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");
+      XDELETEVEC (used);
     }
 }
 \f
@@ -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 ();");
     }
 
+  XDELETEVEC (used);
+
   /* Call `get_insns' to extract the list of all the
      insns emitted within this gen_... function.  */
 
index 8c097dc..dc3ce40 100644 (file)
@@ -513,7 +513,7 @@ emit_delay_sequence (rtx insn, rtx list, int length)
 
   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.  */