On Mon, Mar 19, 2018 at 08:09:00PM +0000, Michael Matz wrote:
> Hi,
> 
> On Mon, 19 Mar 2018, Jakub Jelinek wrote:
> 
> > The inline-asm here has "1p" constraint and we end up with
> > (plus (frame) (const_int ...))
> 
> Blaeh.  Note that "1p" is actually invalid:
> 
> --------------
> `0', `1', `2', ... `9'
>      An operand that matches the specified operand number is allowed.
>      If a digit is used together with letters within the same
>      alternative, the digit should come last.
> --------------
> 
> Changing the order to "p1" would disable the transformation as well, 
> because match_asm_constraints_1() uses strtoul on the constraint start.

Ah, ok, but
  asm volatile ("" : "=m,m" (b), "=r,r" (b) : "1,p" (b));
ICEs the same way, and that should be valid even according to the above
description.

> ... this makes sense.  But I think you're too generous in supporting 
> strange inputs:
> 
> >        if (! REG_P (output)
> >       || rtx_equal_p (output, input)
> >       || (GET_MODE (input) != VOIDmode
> > -         && GET_MODE (input) != GET_MODE (output)))
> > +         && GET_MODE (input) != GET_MODE (output))
> > +     || !(REG_P (input) || SUBREG_P (input)
> > +          || MEM_P (input) || CONSTANT_P (input)))
> 
> I'd only allow REG_P (input) as well, not any of the other forms.

I'll try to gather some statistics on what kind of inputs appear there
during bootstrap/regtest and will try to write a few testcases to see
if just || ! REG_P (output) is sufficient or not.

        Jakub

Reply via email to