AddLocationNode question

Gilles Duboscq duboscq at ssw.jku.at
Thu Apr 24 14:28:52 UTC 2014


The way you use AddLocation seems correct.
The input type problem should be fixed after 0ba5f1038bd4 [1].

If it still doesn't work, do the computation of  num_s_regs * 4 +
num_d_regs * 8 as normal arithmetic nodes and then use an
IndexedLocationNode to add the offset.

-Gilles

[1] http://hg.openjdk.java.net/graal/graal/rev/0ba5f1038bd4

On Mon, Apr 21, 2014 at 10:33 PM, Tom Deneau <tom.deneau at amd.com> wrote:
> Looking for advice from someone more knowledgeable about the graal Nodes...
>
> This is for the host-based trampoline code that Gilles designed to handle hsail deoptimization.  The original code handled only registers in the hsail frame and I was trying to add support for stack slots.
>
> The hsail frame looks like
>     byte  num_s_regs;    // 32 bit registers, rounded up to an even number
>     byte  num_d_regs;    // 64-bit registers
>     short num_stack_slots;
>     char _save_area[xxx];    // save area starts here
>     // s_regs stored first
>     // followed by dregs
>     // followed by stackslots
>
>
> The original code (which worked fine) to get a particular d register was as follows, using an IndexedLocationNode, indexed by the number of s registers...
>
>             int longSize = providers.getCodeCache().getTarget().arch.getSizeInBytes(Kind.Long);
>             long offset = config.hsailFrameSaveAreaOffset + longSize * (regNumber - HSAIL.d0.number);
>             LocationNode numSRegsLocation = ConstantLocationNode.create(FINAL_LOCATION, Kind.Byte, config.hsailFrameNumSRegOffset, hostGraph);
>             ValueNode numSRegs = hostGraph.unique(new FloatingReadNode(hsailFrame, numSRegsLocation, null, StampFactory.forInteger(8, false)));
>             numSRegs = SignExtendNode.convert(numSRegs, StampFactory.forKind(Kind.Byte));
>             location = IndexedLocationNode.create(FINAL_LOCATION, valueKind, offset, numSRegs, hostGraph, 4);
>
> To get a particular stackslot I need to access
>     _save_area + num_s_regs * 4 + num_d_regs * 8  + slot.offset.
>
> I thought this could perhaps be done by creating two IndexedLocationNodes (one using num_s_regs, one for num_d_regs) and then creating an AddLocationNode, combining the two IndexedLocationNodes.
>
> but I am getting
> com.oracle.graal.graph.GraalInternalError: java.lang.AssertionError: invalid input of type Value from 14|AddLocation to 10|IndexedLocation (x)
>
> What is the recommended way to do this?  Here is the code I was using:
>
>                 int sizeInBits = (valueKind.isObject() || valueKind.getByteCount() == 8 ? 64 : 32);
>                 int slotStartOffset = HSAIL.getStackOffsetStart(slot, sizeInBits);
>                 int slotStartOffset = offsetToSaveArea + (numSRegs * 4) + (numDRegs * 8) + HSAIL.getStackOffsetStart(slot, sizeInBits);
>                 int longSize = providers.getCodeCache().getTarget().arch.getSizeInBytes(Kind.Long);
>                 long offset = config.hsailFrameSaveAreaOffset + slotStartOffset;
>
>                 LocationNode numSRegsLocation = ConstantLocationNode.create(FINAL_LOCATION, Kind.Byte, config.hsailFrameNumSRegOffset, hostGraph);
>                 ValueNode numSRegs = hostGraph.unique(new FloatingReadNode(hsailFrame, numSRegsLocation, null, StampFactory.forInteger(8, false)));
>                 numSRegs = SignExtendNode.convert(numSRegs, StampFactory.forKind(Kind.Byte));
>                 LocationNode locationSRegsPart = IndexedLocationNode.create(FINAL_LOCATION, valueKind, offset, numSRegs, hostGraph, 4);
>
>                 LocationNode numDRegsLocation = ConstantLocationNode.create(FINAL_LOCATION, Kind.Byte, config.hsailFrameNumDRegOffset, hostGraph);
>                 ValueNode numDRegs = hostGraph.unique(new FloatingReadNode(hsailFrame, numDRegsLocation, null, StampFactory.forInteger(8, false)));
>                 numDRegs = SignExtendNode.convert(numSRegs, StampFactory.forKind(Kind.Byte));
>                 LocationNode locationDRegsPart = IndexedLocationNode.create(FINAL_LOCATION, valueKind, 0, numDRegs, hostGraph, 8);
>
>                 LocationNode location = AddLocationNode.create(locationSRegsPart, locationDRegsPart, hostGraph);
>         ValueNode valueNode = hostGraph.unique(new FloatingReadNode(hsailFrame, location, null, StampFactory.forKind(valueKind)));
>         return valueNode;
>
>
> A related question, could this have all been done with snippets?
>
> -- Tom


More information about the graal-dev mailing list