summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>2011-04-12 14:56:57 +0000
committerrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>2011-04-12 14:56:57 +0000
commit50c0c258ba9fbe80b19dbe69ae3b20580abea973 (patch)
treecc03e3af6c23aedc2d35dd550a24766687e4b0e5
parent458a870618683f21ed97b3c49037ba9017ea3c83 (diff)
downloadgcc-50c0c258ba9fbe80b19dbe69ae3b20580abea973.tar.gz
* recog.h, genoutput.c, optabs.c: Revert last patch.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@172321 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/genoutput.c11
-rw-r--r--gcc/optabs.c61
-rw-r--r--gcc/recog.h2
4 files changed, 20 insertions, 58 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6c130b3b3ec..3a8a279b4c3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/genoutput.c b/gcc/genoutput.c
index 621439f479a..3e89cfd6df1 100644
--- a/gcc/genoutput.c
+++ b/gcc/genoutput.c
@@ -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");
}
diff --git a/gcc/optabs.c b/gcc/optabs.c
index 15f50f7bb48..682b8e40f7c 100644
--- a/gcc/optabs.c
+++ b/gcc/optabs.c
@@ -7001,36 +7001,6 @@ insn_operand_matches (enum insn_code icode, unsigned int opno, rtx operand)
(operand, insn_data[(int) icode].operand[opno].mode)));
}
-/* 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
diff --git a/gcc/recog.h b/gcc/recog.h
index cce1321ad09..0261bc6072d 100644
--- a/gcc/recog.h
+++ b/gcc/recog.h
@@ -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