* recog.h, genoutput.c, optabs.c: Revert last patch.
authorRichard Sandiford <richard.sandiford@linaro.org>
Tue, 12 Apr 2011 14:56:57 +0000 (14:56 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Tue, 12 Apr 2011 14:56:57 +0000 (14:56 +0000)
From-SVN: r172321

gcc/ChangeLog
gcc/genoutput.c
gcc/optabs.c
gcc/recog.h

index 6c130b3b3ec03131b01c86c81ded09fd9b78816a..3a8a279b4c39e751bdcb3ebdb2af9669c8cc261a 100644 (file)
@@ -1,3 +1,7 @@
+2011-04-12  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       * recog.h, genoutput.c, optabs.c: Revert last patch.
+
 2011-04-12  Ramana Radhakrishnan  <ramana.radhakrishnan@linaro.org>
 
        PR target/48090
index 621439f479acb4bf31cb45641ca7293ce252c30b..3e89cfd6df160562cefa452be8d5dd3a4ad763b4 100644 (file)
@@ -66,8 +66,6 @@ along with GCC; see the file COPYING3.  If not see
      MATCH_OPERAND; it is zero for operands that should not be changed during
      register elimination such as MATCH_OPERATORs.
 
-     g. `allows_mem', is true for operands that accept MEM rtxes.
-
   The code number of an insn is simply its position in the machine
   description; code numbers are assigned sequentially to entries in
   the description, starting with code number 0.
@@ -258,8 +256,6 @@ output_operand_data (void)
 
   for (d = odata; d; d = d->next)
     {
-      struct pred_data *pred;
-
       printf ("  {\n");
 
       printf ("    %s,\n",
@@ -273,12 +269,7 @@ output_operand_data (void)
 
       printf ("    %d,\n", d->constraint == NULL ? 1 : 0);
 
-      printf ("    %d,\n", d->eliminable);
-
-      pred = NULL;
-      if (d->predicate)
-       pred = lookup_predicate (d->predicate);
-      printf ("    %d\n", pred && pred->codes[MEM]);
+      printf ("    %d\n", d->eliminable);
 
       printf("  },\n");
     }
index 15f50f7bb480f70772b8f6bddfbf3b28f682185c..682b8e40f7c6bd4f9964e388cac46ef227bb9af6 100644 (file)
@@ -7001,36 +7001,6 @@ insn_operand_matches (enum insn_code icode, unsigned int opno, rtx operand)
              (operand, insn_data[(int) icode].operand[opno].mode)));
 }
 \f
-/* Like maybe_legitimize_operand, but do not change the code of the
-   current rtx value.  */
-
-static bool
-maybe_legitimize_operand_same_code (enum insn_code icode, unsigned int opno,
-                                   struct expand_operand *op)
-{
-  /* See if the operand matches in its current form.  */
-  if (insn_operand_matches (icode, opno, op->value))
-    return true;
-
-  /* If the operand is a memory, try forcing the address into a register.  */
-  if (MEM_P (op->value) && insn_data[(int) icode].operand[opno].allows_mem)
-    {
-      rtx addr, mem, last;
-
-      last = get_last_insn ();
-      addr = force_reg (Pmode, XEXP (op->value, 0));
-      mem = replace_equiv_address (op->value, addr);
-      if (insn_operand_matches (icode, opno, mem))
-       {
-         op->value = mem;
-         return true;
-       }
-      delete_insns_since (last);
-    }
-
-  return false;
-}
-
 /* Try to make OP match operand OPNO of instruction ICODE.  Return true
    on success, storing the new operand value back in OP.  */
 
@@ -7041,25 +7011,22 @@ maybe_legitimize_operand (enum insn_code icode, unsigned int opno,
   enum machine_mode mode, imode;
   bool old_volatile_ok, result;
 
+  old_volatile_ok = volatile_ok;
   mode = op->mode;
+  result = false;
   switch (op->type)
     {
     case EXPAND_FIXED:
-      old_volatile_ok = volatile_ok;
       volatile_ok = true;
-      result = maybe_legitimize_operand_same_code (icode, opno, op);
-      volatile_ok = old_volatile_ok;
-      return result;
+      break;
 
     case EXPAND_OUTPUT:
       gcc_assert (mode != VOIDmode);
-      if (op->value
-         && op->value != const0_rtx
-         && GET_MODE (op->value) == mode
-         && maybe_legitimize_operand_same_code (icode, opno, op))
-       return true;
-
-      op->value = gen_reg_rtx (mode);
+      if (!op->value
+         || op->value == const0_rtx
+         || GET_MODE (op->value) != mode
+         || !insn_operand_matches (icode, opno, op->value))
+       op->value = gen_reg_rtx (mode);
       break;
 
     case EXPAND_INPUT:
@@ -7067,10 +7034,9 @@ maybe_legitimize_operand (enum insn_code icode, unsigned int opno,
       gcc_assert (mode != VOIDmode);
       gcc_assert (GET_MODE (op->value) == VOIDmode
                  || GET_MODE (op->value) == mode);
-      if (maybe_legitimize_operand_same_code (icode, opno, op))
-       return true;
-
-      op->value = copy_to_mode_reg (mode, op->value);
+      result = insn_operand_matches (icode, opno, op->value);
+      if (!result)
+       op->value = copy_to_mode_reg (mode, op->value);
       break;
 
     case EXPAND_CONVERT_TO:
@@ -7104,7 +7070,10 @@ maybe_legitimize_operand (enum insn_code icode, unsigned int opno,
        goto input;
       break;
     }
-  return insn_operand_matches (icode, opno, op->value);
+  if (!result)
+    result = insn_operand_matches (icode, opno, op->value);
+  volatile_ok = old_volatile_ok;
+  return result;
 }
 
 /* Make OP describe an input operand that should have the same value
index cce1321ad09d605e68963066f29039062b41f58a..0261bc6072d7c37a803ffd86dd4b9ed776ba6836 100644 (file)
@@ -272,8 +272,6 @@ struct insn_operand_data
   const char is_operator;
 
   const char eliminable;
-
-  const char allows_mem;
 };
 
 /* Legal values for insn_data.output_format.  Indicate what type of data