aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Sandiford <rdsandiford@googlemail.com>2014-05-06 19:22:16 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2014-05-06 19:22:16 +0000
commit3379b71f51c36c499ca5ce4ec877bd70b96a580e (patch)
treecc060c93a156cf1f7771a6b514b00fb2e6bec714 /gcc
parent224dbc07a51880b778766549934fcdac9b2f6097 (diff)
downloadgcc-3379b71f51c36c499ca5ce4ec877bd70b96a580e.zip
gcc-3379b71f51c36c499ca5ce4ec877bd70b96a580e.tar.gz
gcc-3379b71f51c36c499ca5ce4ec877bd70b96a580e.tar.bz2
revert: lra-constraints.c (valid_address_p): Move earlier in file.
gcc/ Revert: 2014-05-03 Richard Sandiford <rdsandiford@googlemail.com> * lra-constraints.c (valid_address_p): Move earlier in file. Add a constraint argument to the address_info version. (satisfies_memory_constraint_p): New function. (satisfies_address_constraint_p): Likewise. (process_alt_operands, curr_insn_transform): Use them. (process_address): Pass the constraint to valid_address_p when checking address operands. From-SVN: r210121
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog13
-rw-r--r--gcc/lra-constraints.c150
2 files changed, 71 insertions, 92 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9cfa798..00b1e5a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,16 @@
+2014-05-06 Richard Sandiford <rdsandiford@googlemail.com>
+
+ Revert:
+ 2014-05-03 Richard Sandiford <rdsandiford@googlemail.com>
+
+ * lra-constraints.c (valid_address_p): Move earlier in file.
+ Add a constraint argument to the address_info version.
+ (satisfies_memory_constraint_p): New function.
+ (satisfies_address_constraint_p): Likewise.
+ (process_alt_operands, curr_insn_transform): Use them.
+ (process_address): Pass the constraint to valid_address_p when
+ checking address operands.
+
2014-05-06 Richard Sandiford <r.sandiford@uk.ibm.com>
* lto-cgraph.c (compute_ltrans_boundary): Make node variables local
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index f59bf55..aac5087 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -317,94 +317,6 @@ in_mem_p (int regno)
return get_reg_class (regno) == NO_REGS;
}
-/* Return 1 if ADDR is a valid memory address for mode MODE in address
- space AS, and check that each pseudo has the proper kind of hard
- reg. */
-static int
-valid_address_p (enum machine_mode mode ATTRIBUTE_UNUSED,
- rtx addr, addr_space_t as)
-{
-#ifdef GO_IF_LEGITIMATE_ADDRESS
- lra_assert (ADDR_SPACE_GENERIC_P (as));
- GO_IF_LEGITIMATE_ADDRESS (mode, addr, win);
- return 0;
-
- win:
- return 1;
-#else
- return targetm.addr_space.legitimate_address_p (mode, addr, 0, as);
-#endif
-}
-
-/* Return whether address AD is valid. If CONSTRAINT is null,
- check for general addresses, otherwise check the extra constraint
- CONSTRAINT. */
-static bool
-valid_address_p (struct address_info *ad, const char *constraint = 0)
-{
- /* Some ports do not check displacements for eliminable registers,
- so we replace them temporarily with the elimination target. */
- rtx saved_base_reg = NULL_RTX;
- rtx saved_index_reg = NULL_RTX;
- rtx *base_term = strip_subreg (ad->base_term);
- rtx *index_term = strip_subreg (ad->index_term);
- if (base_term != NULL)
- {
- saved_base_reg = *base_term;
- lra_eliminate_reg_if_possible (base_term);
- if (ad->base_term2 != NULL)
- *ad->base_term2 = *ad->base_term;
- }
- if (index_term != NULL)
- {
- saved_index_reg = *index_term;
- lra_eliminate_reg_if_possible (index_term);
- }
- bool ok_p = (constraint
-#ifdef EXTRA_CONSTRAINT_STR
- ? EXTRA_CONSTRAINT_STR (*ad->outer, constraint[0], constraint)
-#else
- ? false
-#endif
- : valid_address_p (ad->mode, *ad->outer, ad->as));
- if (saved_base_reg != NULL_RTX)
- {
- *base_term = saved_base_reg;
- if (ad->base_term2 != NULL)
- *ad->base_term2 = *ad->base_term;
- }
- if (saved_index_reg != NULL_RTX)
- *index_term = saved_index_reg;
- return ok_p;
-}
-
-#ifdef EXTRA_CONSTRAINT_STR
-/* Return true if, after elimination, OP satisfies extra memory constraint
- CONSTRAINT. */
-static bool
-satisfies_memory_constraint_p (rtx op, const char *constraint)
-{
- struct address_info ad;
-
- if (!MEM_P (op))
- return false;
-
- decompose_mem_address (&ad, op);
- return valid_address_p (&ad, constraint);
-}
-
-/* Return true if, after elimination, OP satisfies extra address constraint
- CONSTRAINT. */
-static bool
-satisfies_address_constraint_p (rtx op, const char *constraint)
-{
- struct address_info ad;
-
- decompose_lea_address (&ad, &op);
- return valid_address_p (&ad, constraint);
-}
-#endif
-
/* Initiate equivalences for LRA. As we keep original equivalences
before any elimination, we need to make copies otherwise any change
in insns might change the equivalences. */
@@ -2029,7 +1941,7 @@ process_alt_operands (int only_alternative)
#ifdef EXTRA_CONSTRAINT_STR
if (EXTRA_MEMORY_CONSTRAINT (c, p))
{
- if (satisfies_memory_constraint_p (op, p))
+ if (EXTRA_CONSTRAINT_STR (op, c, p))
win = true;
else if (spilled_pseudo_p (op))
win = true;
@@ -2048,7 +1960,7 @@ process_alt_operands (int only_alternative)
}
if (EXTRA_ADDRESS_CONSTRAINT (c, p))
{
- if (satisfies_address_constraint_p (op, p))
+ if (EXTRA_CONSTRAINT_STR (op, c, p))
win = true;
/* If we didn't already win, we can reload
@@ -2664,6 +2576,60 @@ process_alt_operands (int only_alternative)
return ok_p;
}
+/* Return 1 if ADDR is a valid memory address for mode MODE in address
+ space AS, and check that each pseudo has the proper kind of hard
+ reg. */
+static int
+valid_address_p (enum machine_mode mode ATTRIBUTE_UNUSED,
+ rtx addr, addr_space_t as)
+{
+#ifdef GO_IF_LEGITIMATE_ADDRESS
+ lra_assert (ADDR_SPACE_GENERIC_P (as));
+ GO_IF_LEGITIMATE_ADDRESS (mode, addr, win);
+ return 0;
+
+ win:
+ return 1;
+#else
+ return targetm.addr_space.legitimate_address_p (mode, addr, 0, as);
+#endif
+}
+
+/* Return whether address AD is valid. */
+
+static bool
+valid_address_p (struct address_info *ad)
+{
+ /* Some ports do not check displacements for eliminable registers,
+ so we replace them temporarily with the elimination target. */
+ rtx saved_base_reg = NULL_RTX;
+ rtx saved_index_reg = NULL_RTX;
+ rtx *base_term = strip_subreg (ad->base_term);
+ rtx *index_term = strip_subreg (ad->index_term);
+ if (base_term != NULL)
+ {
+ saved_base_reg = *base_term;
+ lra_eliminate_reg_if_possible (base_term);
+ if (ad->base_term2 != NULL)
+ *ad->base_term2 = *ad->base_term;
+ }
+ if (index_term != NULL)
+ {
+ saved_index_reg = *index_term;
+ lra_eliminate_reg_if_possible (index_term);
+ }
+ bool ok_p = valid_address_p (ad->mode, *ad->outer, ad->as);
+ if (saved_base_reg != NULL_RTX)
+ {
+ *base_term = saved_base_reg;
+ if (ad->base_term2 != NULL)
+ *ad->base_term2 = *ad->base_term;
+ }
+ if (saved_index_reg != NULL_RTX)
+ *index_term = saved_index_reg;
+ return ok_p;
+}
+
/* Make reload base reg + disp from address AD. Return the new pseudo. */
static rtx
base_plus_disp_to_reg (struct address_info *ad)
@@ -2866,7 +2832,7 @@ process_address (int nop, rtx *before, rtx *after)
EXTRA_CONSTRAINT_STR for the validation. */
if (constraint[0] != 'p'
&& EXTRA_ADDRESS_CONSTRAINT (constraint[0], constraint)
- && valid_address_p (&ad, constraint))
+ && EXTRA_CONSTRAINT_STR (op, constraint[0], constraint))
return change_p;
#endif
@@ -3573,7 +3539,7 @@ curr_insn_transform (void)
break;
#ifdef EXTRA_CONSTRAINT_STR
if (EXTRA_MEMORY_CONSTRAINT (c, constraint)
- && satisfies_memory_constraint_p (tem, constraint))
+ && EXTRA_CONSTRAINT_STR (tem, c, constraint))
break;
#endif
}