gcc torture test pr52286.c

Jeff Law law@redhat.com
Mon Aug 28 17:56:00 GMT 2017

On 08/28/2017 11:33 AM, Michael Matz wrote:
> Hi,
> On Mon, 28 Aug 2017, Jeff Law wrote:
>>>   long a, b = 0;
>>>   asm ("" : "=r" (a) : "0" (0));
>> I wouldn't use a matching constraint here.  Something like this is
>> probably closer to what you want:
>> asm ("" : "=r" (a) : "n" (0));
>> The "n" says accept any immediate integer constant with a compile time
>> known value.
>> In fact, I could probably argue that "0" (0) should generate an error as
>> a constraint -- it's meaningless in that you can't match a constant
>> integer input to any output.
> Huh?  No.  The semantics are perfectly valid for this.  It says "put the 
> output into a register, place that into variable 'a', put the input value 
> into the same register".  Value is just that, an arbitrary rvalue (of 
> correct type of course).  We accept any expression forms, as we should, 
> including constants.
I can't remember matching constraints ever working that way.

REgister allocation and reloading will first try to allocate the two
objects to the same register and if that doesn't work it will emit
copies to ensure they are the same register.

But that doesn't work when one of the objects isn't a register.  There's
no allocno for the constant.  It's just that, a constant.

> FWIW, the above is a "portable" way to get the value 0 into 'a' without 
> the compiler knowing.
?!?  Mine is just as portable and should actually work :-)


More information about the Gcc mailing list