LIRGenerator.emitMove()

Andrew Haley aph at redhat.com
Thu Oct 27 16:13:05 UTC 2016


Hi,

On 27/10/16 16:53, Roland Schatz wrote:

> On 10/27/2016 05:29 PM, Andrew Haley wrote:
>>      @Override
>>      public Variable emitMove(Value input) {
>>          assert !(input instanceof Variable) : "Creating a copy of a variable via this method is not supported (and potentially a bug): " + input;
>>          Variable result = newVariable(input.getValueKind());
>>          emitMove(result, input);
>>          return result;
>>      }
>>
>> So how am I supposed to copy a variable?
> In Graal LIR, there are no destructive updates, so there should never be 
> a need to copy a variable (it's basically SSA-form before register 
> allocation).

OK, so this is a bug in the AArch64 port.  Got it.

> If you want to "modify" a variable (e.g. two-operand assembler 
> instruction), you should still create a new variable for the result, and 
> put a HINT on the LIR instruction that does the modification. The 
> register allocator will try to allocate the input and the result to the 
> same register. If it's not possible to do so (e.g. because the input has 
> another use later), you have to do the move from the input register to 
> the result register manually.
> 
> See for example the class AMD64Binary.TwoOp. That's used for 
> implementing the x86 two-operand arithmetic instructions that have a 
> common register for the result and the first input.
> (the "AMD64Move.move(crb, masm, result, x);" call emits a MOV 
> instruction if `result` and `x` are different registers, and nothing if 
> they are the same)

OK.  I'll look some more, thanks.

Andrew.




More information about the graal-dev mailing list