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