genemit.c (gen_exp): New argument used.
authorRichard Henderson <rth@redhat.com>
Thu, 7 Mar 2002 01:15:59 +0000 (17:15 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Thu, 7 Mar 2002 01:15:59 +0000 (17:15 -0800)
        * genemit.c (gen_exp): New argument used.  Invoke copy_rtx
        if used indicates we've already emitted one copy of an operand.
        (gen_insn, gen_expand, output_add_clobbers): Supply a null used.
        (gen_split): Supply a non-null used.

From-SVN: r50386

gcc/ChangeLog
gcc/genemit.c

index 583e83a1ab32e6984f995039c868e2b5290f9a39..b829d40ff2fdfaa937778a6703401cef8d6901aa 100644 (file)
@@ -1,3 +1,10 @@
+2002-03-06  Richard Henderson  <rth@redhat.com>
+
+       * genemit.c (gen_exp): New argument used.  Invoke copy_rtx
+       if used indicates we've already emitted one copy of an operand.
+       (gen_insn, gen_expand, output_add_clobbers): Supply a null used.
+       (gen_split): Supply a non-null used.
+
 2002-03-06  Ulrich Weigand  <uweigand@de.ibm.com>
 
         * reload1.c (reload): Unshare all rtl after reload is done.
index 712dd24e38bea0683e69bcd9d85c3d647afc2ff8..2d11d2be77cf9d05678b8dfabf058d74ad5c1fd2 100644 (file)
@@ -58,7 +58,7 @@ struct clobber_ent
 static void max_operand_1              PARAMS ((rtx));
 static int max_operand_vec             PARAMS ((rtx, int));
 static void print_code                 PARAMS ((RTX_CODE));
-static void gen_exp                    PARAMS ((rtx, enum rtx_code));
+static void gen_exp                    PARAMS ((rtx, enum rtx_code, char *));
 static void gen_insn                   PARAMS ((rtx));
 static void gen_expand                 PARAMS ((rtx));
 static void gen_split                  PARAMS ((rtx));
@@ -155,9 +155,10 @@ gen_rtx_scratch (x, subroutine_type)
    substituting any operand references appearing within.  */
 
 static void
-gen_exp (x, subroutine_type)
+gen_exp (x, subroutine_type, used)
      rtx x;
      enum rtx_code subroutine_type;
+     char *used;
 {
   RTX_CODE code;
   int i;
@@ -176,6 +177,15 @@ gen_exp (x, subroutine_type)
     {
     case MATCH_OPERAND:
     case MATCH_DUP:
+      if (used)
+       {
+         if (used[XINT (x, 0)])
+           {
+             printf ("copy_rtx (operand%d)", XINT (x, 0));
+             return;
+           }
+         used[XINT (x, 0)] = 1;
+       }
       printf ("operand%d", XINT (x, 0));
       return;
 
@@ -188,7 +198,7 @@ gen_exp (x, subroutine_type)
       for (i = 0; i < XVECLEN (x, 1); i++)
        {
          printf (",\n\t\t");
-         gen_exp (XVECEXP (x, 1, i), subroutine_type);
+         gen_exp (XVECEXP (x, 1, i), subroutine_type, used);
        }
       printf (")");
       return;
@@ -199,7 +209,7 @@ gen_exp (x, subroutine_type)
       for (i = 0; i < XVECLEN (x, 2); i++)
        {
          printf (",\n\t\t");
-         gen_exp (XVECEXP (x, 2, i), subroutine_type);
+         gen_exp (XVECEXP (x, 2, i), subroutine_type, used);
        }
       printf (")");
       return;
@@ -262,7 +272,7 @@ gen_exp (x, subroutine_type)
        break;
       printf (",\n\t");
       if (fmt[i] == 'e' || fmt[i] == 'u')
-       gen_exp (XEXP (x, i), subroutine_type);
+       gen_exp (XEXP (x, i), subroutine_type, used);
       else if (fmt[i] == 'i')
        printf ("%u", XINT (x, i));
       else if (fmt[i] == 's')
@@ -274,7 +284,7 @@ gen_exp (x, subroutine_type)
          for (j = 0; j < XVECLEN (x, i); j++)
            {
              printf (",\n\t\t");
-             gen_exp (XVECEXP (x, i, j), subroutine_type);
+             gen_exp (XVECEXP (x, i, j), subroutine_type, used);
            }
          printf (")");
        }
@@ -397,7 +407,7 @@ gen_insn (insn)
   if (XVECLEN (insn, 1) == 1)
     {
       printf ("  return ");
-      gen_exp (XVECEXP (insn, 1, 0), DEFINE_INSN);
+      gen_exp (XVECEXP (insn, 1, 0), DEFINE_INSN, NULL);
       printf (";\n}\n\n");
     }
   else
@@ -408,7 +418,7 @@ gen_insn (insn)
       for (i = 0; i < XVECLEN (insn, 1); i++)
        {
          printf (",\n\t\t");
-         gen_exp (XVECEXP (insn, 1, i), DEFINE_INSN);
+         gen_exp (XVECEXP (insn, 1, i), DEFINE_INSN, NULL);
        }
       printf ("));\n}\n\n");
     }
@@ -454,7 +464,7 @@ gen_expand (expand)
       && XVECLEN (expand, 1) == 1)
     {
       printf ("  return ");
-      gen_exp (XVECEXP (expand, 1, 0), DEFINE_EXPAND);
+      gen_exp (XVECEXP (expand, 1, 0), DEFINE_EXPAND, NULL);
       printf (";\n}\n\n");
       return;
     }
@@ -535,7 +545,7 @@ gen_expand (expand)
        printf ("  emit (");
       else
        printf ("  emit_insn (");
-      gen_exp (next, DEFINE_EXPAND);
+      gen_exp (next, DEFINE_EXPAND, NULL);
       printf (");\n");
       if (GET_CODE (next) == SET && GET_CODE (SET_DEST (next)) == PC
          && GET_CODE (SET_SRC (next)) == LABEL_REF)
@@ -561,6 +571,7 @@ gen_split (split)
   const char *const name =
     ((GET_CODE (split) == DEFINE_PEEPHOLE2) ? "peephole2" : "split");
   const char *unused;
+  char *used;
 
   if (XVEC (split, 0) == 0)
     fatal ("define_%s (definition %d) lacks a pattern", name,
@@ -574,6 +585,7 @@ gen_split (split)
   max_operand_vec (split, 2);
   operands = MAX (max_opno, MAX (max_dup_opno, max_scratch_opno)) + 1;
   unused = (operands == 0 ? " ATTRIBUTE_UNUSED" : "");
+  used = xcalloc (1, operands);
 
   /* Output the prototype, function name and argument declarations.  */
   if (GET_CODE (split) == DEFINE_PEEPHOLE2)
@@ -645,7 +657,7 @@ gen_split (split)
        printf ("  emit (");
       else
        printf ("  emit_insn (");
-      gen_exp (next, GET_CODE (split));
+      gen_exp (next, GET_CODE (split), used);
       printf (");\n");
       if (GET_CODE (next) == SET && GET_CODE (SET_DEST (next)) == PC
          && GET_CODE (SET_SRC (next)) == LABEL_REF)
@@ -658,6 +670,8 @@ gen_split (split)
   printf ("  _val = gen_sequence ();\n");
   printf ("  end_sequence ();\n");
   printf ("  return _val;\n}\n\n");
+
+  free (used);
 }
 \f
 /* Write a function, `add_clobbers', that is given a PARALLEL of sufficient
@@ -686,7 +700,7 @@ output_add_clobbers ()
        {
          printf ("      XVECEXP (pattern, 0, %d) = ", i);
          gen_exp (XVECEXP (clobber->pattern, 1, i),
-                  GET_CODE (clobber->pattern));
+                  GET_CODE (clobber->pattern), NULL);
          printf (";\n");
        }