diff options
author | Richard Sandiford <rdsandiford@googlemail.com> | 2014-05-06 19:22:16 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2014-05-06 19:22:16 +0000 |
commit | 3379b71f51c36c499ca5ce4ec877bd70b96a580e (patch) | |
tree | cc060c93a156cf1f7771a6b514b00fb2e6bec714 /gcc | |
parent | 224dbc07a51880b778766549934fcdac9b2f6097 (diff) | |
download | gcc-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/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/lra-constraints.c | 150 |
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 } |