> -----Original Message-----
> From: Eric Botcazou [mailto:ebotca...@adacore.com]
> Sent: 17 January 2014 16:23
> To: Paulo Matos
> Cc: gcc@gcc.gnu.org
> Subject: Re: Avoiding paradoxical subregs
> 
> > I can use canonicalize_comparison like s390 to remove the subreg, however
> > the question then becomes about how to avoid this in general. We cannot
> > allow a zero_extend to become a paradoxical subreg and then have the subreg
> > discarded. Most of our instructions are vector instructions which will
> > change the remainder of the register.
> >
> > I have defined WORD_REGISTER_OPERATIONS and CANNOT_CHANGE_MODE_CLASS(from,
> > to, class) and set it to true if GET_MODE_SIZE (from) < GET_MODE_SIZE (to)
> > but it didn't help.
> >
> > Any suggestions for a generic solution?
> 
> What kind of generic solution?  Eliminating paradoxical subregs altogether?
> That's very likely not doable if you define WORD_REGISTER_OPERATIONS anyway.
> You need to pinpoint where things start to go wrong, for example in combine.
> 

I am not implying that this is a GCC bug, unless you think 
WORD_REGISTER_OPERATIONS should have avoided the creation of such paradoxical 
subreg. What I was looking after was for a generic solution on my backend that 
either eliminates the use of paradoxical subregs or forces reload the transform 
(subreg:m (reg:n K)), where subreg is paradoxical, into a zero_extend.

I mentioned a generic one because the only solution I have is for comparison 
instructions only:
canonicalize_comparison (int *, rtx *op0, rtx *,
                                  bool op0_preserve_value)
{
  if (op0_preserve_value)
    return;

  /* Remove paradoxical subregs.  */
  if (GET_CODE (*op0) == SUBREG)
    {
      rtx inner = SUBREG_REG (*op0);

      if (GET_MODE_SIZE (GET_MODE (inner)) < GET_MODE_SIZE (GET_MODE (*op0)))
        *op0 = simplify_gen_unary (ZERO_EXTEND, GET_MODE (*op0), inner, 
GET_MODE (inner));
    }
}

Another more generic solution would be to write my own register_operand 
predicate that excludes paradoxical subregs but I am not sure what kind of 
pandora's box I am opening by doing that.
-- 
Paulo Matos

Reply via email to