> On 2012-08-31 07:49, Ian Bolton wrote:
> > +(define_split
> > + [(set (match_operand:DI 0 "register_operand" "=r")
> > + (const:DI (plus:DI (match_operand:DI 1 "aarch64_valid_symref"
> "S")
> > + (match_operand:DI 2 "const_int_operand"
> "i"))))]
> > + ""
> > + [(set (match_dup 0) (high:DI (const:DI (plus:DI (match_dup 1)
> > + (match_dup 2)))))
> > + (set (match_dup 0) (lo_sum:DI (match_dup 0)
> > + (const:DI (plus:DI (match_dup 1)
> > + (match_dup 2)))))]
> > + ""
> > +)
>
> You ought not need this as a separate split, since (CONST ...) should
> be handled exactly like (SYMBOL_REF).
I see in combine.c that it does get done for a MEM (which is how my
earlier patch worked), but not when it's being used for other reasons
(hence the title of this email).
See below for current code from find_split_point:
case MEM:
#ifdef HAVE_lo_sum
/* If we have (mem (const ..)) or (mem (symbol_ref ...)), split it
using LO_SUM and HIGH. */
if (GET_CODE (XEXP (x, 0)) == CONST
|| GET_CODE (XEXP (x, 0)) == SYMBOL_REF)
{
enum machine_mode address_mode
= targetm.addr_space.address_mode (MEM_ADDR_SPACE (x));
SUBST (XEXP (x, 0),
gen_rtx_LO_SUM (address_mode,
gen_rtx_HIGH (address_mode, XEXP (x, 0)),
XEXP (x, 0)));
return &XEXP (XEXP (x, 0), 0);
}
#endif
If I don't use my split pattern, I could alter combine to remove the
requirement that parent is a MEM.
What do you think?
>
> Also note that constraints ("=r" etc) aren't used for splits.
>
If I keep the pattern, I will remove the constraints. Thanks for the
pointers in this regard.
Cheers,
Ian