> 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




Reply via email to