AddLocationNode question

Deneau, Tom tom.deneau at amd.com
Fri Apr 25 22:25:43 UTC 2014


Gilles --

After thinking about this more, I realized that we have only one
deopt exit from an hsail kernel, so all the saved hsailFrames
for a given kernel have the same num_s_regs, num_d_regs, etc.
(sort of the union of all the live registers at the various deopt points).

So since all the hsailFrames for a given kernel are the same structure,
we can treat num_s_regs, num_d_regs, etc as compile time constants (for that kernel).
Which means we don't even need IndexedLocationNodes.

-- Tom

> -----Original Message-----
> From: gilwooden at gmail.com [mailto:gilwooden at gmail.com] On Behalf Of
> Gilles Duboscq
> Sent: Thursday, April 24, 2014 9:29 AM
> To: Deneau, Tom
> Cc: graal-dev at openjdk.java.net
> Subject: Re: AddLocationNode question
> 
> 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