getting newVariables in HSAILLIRGenerator
Deneau, Tom
tom.deneau at amd.com
Thu Dec 5 13:38:58 PST 2013
We were playing around with hsail handling for a deoptimization node.
As part of the codegen for the deopt node, we needed a couple of scratch registers so in our LIRGenerator we have
@Override
public void emitDeoptimize(Value actionAndReason, DeoptimizingNode deopting) {
Variable scratch64 = newVariable(Kind.Object);
Variable scratch32 = newVariable(Kind.Int);
append(new DeoptimizeOp(actionAndReason, deopting, getMetaAccess(), scratch64, scratch32));
}
and inside our HSAIL DeooptimizeOp we have
@Use({REG, CONST}) protected Value actionAndReason;
protected DeoptimizingNode deopting;
protected MetaAccessProvider metaAccessProvider;
@Temp({REG}) private AllocatableValue scratch64;
@Temp({REG}) private AllocatableValue scratch32;
However, maybe I am doing something wrong with the annotations because it seems that the register allocator will pick registers for scratch64, scratch32 that are really live. For instance, sometimes the deopt node is jumped to from various locations with different codes as shown below. In this case, the compiler assigned scratch32 to be $s0, but that should be considered in use coming from the @L12 block.
@L12:
mov_b32 $s0, -35; // ClassCastException
brn @L14;
@L14:
// Deoptimization for Variable Reason, scratch64=d0|a, scratch32=s0|i
... deoptimize codegen follows
-- Tom
More information about the graal-dev
mailing list