webrev to extend HSAIL backend deoptimization to support live values in stack slots

Doug Simon doug.simon at oracle.com
Fri May 2 20:40:22 UTC 2014


Hi Tom,

I’ve integrated this patch with the following small fixes:

o Made it pass ‘mx eclipseformat’
o Made it pass ‘mx unittest CheckGraalInvariants’
o Made OopSaver subclass StackObj to ensure it is only ever stack allocated
o Fixed ‘mx —vm server-nograal build’ compile errors in vmStructs.cpp due to missing #ifdef GRAAL guards.

Some of these issues were found by running ‘mx gate’. It would be great if you could do this for future patches.

-Doug

On May 1, 2014, at 12:28 AM, Deneau, Tom <tom.deneau at amd.com> wrote:

> I have placed a webrev up at 
> http://cr.openjdk.java.net/~tdeneau/graal-webrevs/webrev-hsail-stackslot-deopt/webrev  
> which we would like to get checked into the graal trunk.
> 
> This webrev extends the existing hsail deoptimization logic (which
> only supports deoptimization points where the live values are in
> registers) to handle the case where the live values are in stackslots.
> 
> Here are the major areas that get affected by stack slot deoptimization:
> 
>   1) At the deopt exit point of a kernel, need to save the required
>      stack slot variables into the hsail frame.  This is some new
>      code in HSAILHotSpotBackend.
> 
>   2) The host trampoline code needs to handle the case where a
>      deoptimization value is in a stack slot.  See
>      getNodeForStackSlotFromFrame in HSAILHotSpotBackend.
> 
>      * In doing this 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.  So we can
>        treat num_s_regs, num_d_regs, etc as compile time constants
>        (for that kernel).  This simplified the LocationNodes for
>        building the hostgraph.
> 
>   3) The oopmap data that can be used from the JVM side to take care
>      of the case where oops might move under GC needs to handle the
>      case that stack slot variables could also be oops.
> 
> 
> Regarding #3 above, the way the current hsail oopmap data is saved (as
> a single 16-bit integer in each frame representing the $d registers)
> needed some redesign.  Now that we will also need an intderminately
> longer set of bits to represent stack slots oops, a better strategy
> would be to not save the oopsmap at deopt time but instead have some
> deopt metadata in a form that the JVM side could access which would
> map a deopt "PC" to an oopmap (set of bits) for that PC.  This was
> done thru OopMapArrayBuilder in HSAILHotSpotBackend (at compile time),
> and OopSaver class in gpu_hsail.cpp (at execute time).
> 
> I added fields to ExternalCompilationResult and create a
> HSAILHotSpotNmethod to pass the oopMapArray from the compile time
> environment to the execute time.
> 
> The deopt save area (allocated on the C++ side) used to allocate an
> area for each workitem that was a fixed size big enough to handle a
> deopt that saved all the registers.  Now it is computed based on the
> actual number of s registers, d registers and stack slots saved for
> that compilation.  See gpu_hsail.cpp and gpu_hsail.hpp.
> 
> Similarly the temporaray oopSave array allocated from the java side
> now uses the register and stack slot counts to determine how big an
> Object Array to allocate.  (this oopSave array will go away some day
> when we implement the better oops_do support for the oops in the
> HSAILFrame).
> 
> Other changes:
> 
>  * Some old junit tests that had been designed to test stack slots
>    had been disabled once deoptimization logic was added because some
>    of their deopt points needed to save stack slots, which was not
>    supported.  These tests were re-enabled in this webrev.  (Note:
>    these tests never actually deopted).
> 
>  * Some HSAIL backend LIR Ops had @Use annotations that incorrectly
>    included STACK.  These were fixed and some existing Ops (that did
>    not declare @Use(STACK) had their names changed to better reflect
>    what they were doing.
> 
>  * In DeoptimizeOp, (HSAILControlFlow) and HSAILHotSpotSafepointOp,
>    removed code that computed the $d register oopmap for that
>    deoptimization point.  This is all computed now in the
>    OopMapArrayBuilder so doesn't need to be computed and saved at
>    each deopt point.
> 
>  * Some new junit tests to specifically test deoptimizations that
>    used stack slots (and had oops in stack slots).  Including a
>    forceDeopt call which uses @MethodSubtitution
>    (ForceDeoptSubstitutions.java)
> 



More information about the graal-dev mailing list