Ping.
Richard Sandiford <richard.sandif...@linaro.org> writes: > Richard Sandiford <richard.sandif...@linaro.org> writes: >> James Greenhalgh <james.greenha...@arm.com> writes: >>> On Tue, Aug 22, 2017 at 10:23:47AM +0100, Richard Sandiford wrote: >>>> Previously aarch64_classify_address used an rtx code to distinguish >>>> LDP/STP addresses from normal addresses; the code was PARALLEL >>>> to select LDP/STP and anything else to select normal addresses. >>>> This patch replaces that parameter with a dedicated enum. >>>> >>>> The SVE port will add another enum value that didn't map naturally >>>> to an rtx code. >>>> >>>> Tested on aarch64-linux-gnu. OK to install? >>> >>> I can't say I really like this new interface, I'd prefer two wrappers >>> aarch64_legitimate_address_p , aarch64_legitimate_ldp_address_p (or similar) >>> around your new interface, and for most code to simply call the wrapper. >>> Or an overloaded call that filled in ADDR_QUERY_M automatically, to save >>> that spreading through the backend. >> >> OK, I went for the second, putting the query type last and making it >> an optional argument. > > By way of a ping, here's the patch updated to current trunk. > > Tested on aarch64-linux-gnu. OK to install? > > Thanks, > Richard > > 2017-09-18 Richard Sandiford <richard.sandif...@linaro.org> > Alan Hayward <alan.hayw...@arm.com> > David Sherwood <david.sherw...@arm.com> > > gcc/ > * config/aarch64/aarch64-protos.h (aarch64_addr_query_type): New enum. > (aarch64_legitimate_address_p): Use it instead of an rtx code, > as an optional final parameter. > * config/aarch64/aarch64.c (aarch64_classify_address): Likewise. > (aarch64_legitimate_address_p): Likewise. > (aarch64_address_valid_for_prefetch_p): Update calls accordingly. > (aarch64_legitimate_address_hook_p): Likewise. > (aarch64_print_operand_address): Likewise. > (aarch64_address_cost): Likewise. > * config/aarch64/constraints.md (Umq, Ump): Likewise. > * config/aarch64/predicates.md (aarch64_mem_pair_operand): Likewise. > > Index: gcc/config/aarch64/aarch64-protos.h > =================================================================== > --- gcc/config/aarch64/aarch64-protos.h 2017-09-18 14:41:37.369070450 > +0100 > +++ gcc/config/aarch64/aarch64-protos.h 2017-09-18 14:42:29.656488378 > +0100 > @@ -111,6 +111,19 @@ enum aarch64_symbol_type > SYMBOL_FORCE_TO_MEM > }; > > +/* Classifies the type of an address query. > + > + ADDR_QUERY_M > + Query what is valid for an "m" constraint and a memory_operand > + (the rules are the same for both). > + > + ADDR_QUERY_LDP_STP > + Query what is valid for a load/store pair. */ > +enum aarch64_addr_query_type { > + ADDR_QUERY_M, > + ADDR_QUERY_LDP_STP > +}; > + > /* A set of tuning parameters contains references to size and time > cost models and vectors for address cost calculations, register > move costs and memory move costs. */ > @@ -427,7 +440,8 @@ bool aarch64_float_const_representable_p > > #if defined (RTX_CODE) > > -bool aarch64_legitimate_address_p (machine_mode, rtx, RTX_CODE, bool); > +bool aarch64_legitimate_address_p (machine_mode, rtx, bool, > + aarch64_addr_query_type = ADDR_QUERY_M); > machine_mode aarch64_select_cc_mode (RTX_CODE, rtx, rtx); > rtx aarch64_gen_compare_reg (RTX_CODE, rtx, rtx); > rtx aarch64_load_tp (rtx); > Index: gcc/config/aarch64/aarch64.c > =================================================================== > --- gcc/config/aarch64/aarch64.c 2017-09-18 14:41:37.373588926 +0100 > +++ gcc/config/aarch64/aarch64.c 2017-09-18 14:42:29.657389742 +0100 > @@ -4409,21 +4409,21 @@ virt_or_elim_regno_p (unsigned regno) > || regno == ARG_POINTER_REGNUM); > } > > -/* Return true if X is a valid address for machine mode MODE. If it is, > - fill in INFO appropriately. STRICT_P is true if REG_OK_STRICT is in > - effect. OUTER_CODE is PARALLEL for a load/store pair. */ > +/* Return true if X is a valid address of type TYPE for machine mode MODE. > + If it is, fill in INFO appropriately. STRICT_P is true if > + REG_OK_STRICT is in effect. */ > > static bool > aarch64_classify_address (struct aarch64_address_info *info, > - rtx x, machine_mode mode, > - RTX_CODE outer_code, bool strict_p) > + rtx x, machine_mode mode, bool strict_p, > + aarch64_addr_query_type type = ADDR_QUERY_M) > { > enum rtx_code code = GET_CODE (x); > rtx op0, op1; > > /* On BE, we use load/store pair for all large int mode load/stores. > TI/TFmode may also use a load/store pair. */ > - bool load_store_pair_p = (outer_code == PARALLEL > + bool load_store_pair_p = (type == ADDR_QUERY_LDP_STP > || mode == TImode > || mode == TFmode > || (BYTES_BIG_ENDIAN > @@ -4655,7 +4655,7 @@ aarch64_address_valid_for_prefetch_p (rt > struct aarch64_address_info addr; > > /* PRFM accepts the same addresses as DImode... */ > - bool res = aarch64_classify_address (&addr, x, DImode, MEM, strict_p); > + bool res = aarch64_classify_address (&addr, x, DImode, strict_p); > if (!res) > return false; > > @@ -4691,19 +4691,18 @@ aarch64_legitimate_address_hook_p (machi > { > struct aarch64_address_info addr; > > - return aarch64_classify_address (&addr, x, mode, MEM, strict_p); > + return aarch64_classify_address (&addr, x, mode, strict_p); > } > > -/* Return TRUE if X is a legitimate address for accessing memory in > - mode MODE. OUTER_CODE will be PARALLEL if this is a load/store > - pair operation. */ > +/* Return TRUE if X is a legitimate address of type TYPE for accessing > + memory in mode MODE. STRICT_P is true if REG_OK_STRICT is in effect. */ > bool > -aarch64_legitimate_address_p (machine_mode mode, rtx x, > - RTX_CODE outer_code, bool strict_p) > +aarch64_legitimate_address_p (machine_mode mode, rtx x, bool strict_p, > + aarch64_addr_query_type type) > { > struct aarch64_address_info addr; > > - return aarch64_classify_address (&addr, x, mode, outer_code, strict_p); > + return aarch64_classify_address (&addr, x, mode, strict_p, type); > } > > /* Split an out-of-range address displacement into a base and offset. > @@ -5574,7 +5573,7 @@ aarch64_print_operand_address (FILE *f, > { > struct aarch64_address_info addr; > > - if (aarch64_classify_address (&addr, x, mode, MEM, true)) > + if (aarch64_classify_address (&addr, x, mode, true)) > switch (addr.type) > { > case ADDRESS_REG_IMM: > @@ -6503,7 +6502,7 @@ aarch64_address_cost (rtx x, > int cost = 0; > info.shift = 0; > > - if (!aarch64_classify_address (&info, x, mode, c, false)) > + if (!aarch64_classify_address (&info, x, mode, false)) > { > if (GET_CODE (x) == CONST || GET_CODE (x) == SYMBOL_REF) > { > Index: gcc/config/aarch64/constraints.md > =================================================================== > --- gcc/config/aarch64/constraints.md 2017-09-18 14:41:37.374492621 +0100 > +++ gcc/config/aarch64/constraints.md 2017-09-18 14:42:29.657389742 +0100 > @@ -161,15 +161,15 @@ (define_memory_constraint "Umq" > A memory address which uses a base register with an offset small enough > for > a load/store pair operation in DI mode." > (and (match_code "mem") > - (match_test "aarch64_legitimate_address_p (DImode, XEXP (op, 0), > - PARALLEL, false)"))) > + (match_test "aarch64_legitimate_address_p (DImode, XEXP (op, 0), false, > + ADDR_QUERY_LDP_STP)"))) > > (define_memory_constraint "Ump" > "@internal > A memory address suitable for a load/store pair operation." > (and (match_code "mem") > (match_test "aarch64_legitimate_address_p (GET_MODE (op), XEXP (op, > 0), > - PARALLEL, 1)"))) > + true, ADDR_QUERY_LDP_STP)"))) > > (define_memory_constraint "Utv" > "@internal > Index: gcc/config/aarch64/predicates.md > =================================================================== > --- gcc/config/aarch64/predicates.md 2017-09-18 14:41:37.374492621 +0100 > +++ gcc/config/aarch64/predicates.md 2017-09-18 14:42:29.657389742 +0100 > @@ -174,8 +174,8 @@ (define_predicate "aarch64_mem_pair_offs > > (define_predicate "aarch64_mem_pair_operand" > (and (match_code "mem") > - (match_test "aarch64_legitimate_address_p (mode, XEXP (op, 0), > PARALLEL, > - 0)"))) > + (match_test "aarch64_legitimate_address_p (mode, XEXP (op, 0), false, > + ADDR_QUERY_LDP_STP)"))) > > (define_predicate "aarch64_prefetch_operand" > (match_test "aarch64_address_valid_for_prefetch_p (op, false)"))