escape analysis issue with nested objects
Hontvári Attila
attila at hontvari.net
Fri May 26 11:34:04 UTC 2017
They are eliminated only if multi() is not inlined into an enclosing
loop. (8u101) If I disable inlining it with CompileCommand, C2 compiles
it to an noop method. But when inlining is enabled, the wrapper loop
compiles into a long code: http://pastebin.com/KAq5v2XE
Maybe this issue is related to JDK-8155769
<https://bugs.openjdk.java.net/browse/JDK-8155769>.
2017-05-25 21:50 keltezéssel, Vitaly Davidovich írta:
> Looking at C2 generated assembly (8u121), both cases are eliminated -
> the single() and multi() are dead code. To alleviate the truly dead
> code scenario here, I had these methods return something from the
> allocated object (I created a dummy class that holds an int) and
> accessed those objects via array indexing - no allocations are
> generated (not the array, and not the objects).
>
> On Thu, May 25, 2017 at 3:12 PM, Kirk Pepperdine
> <kirk.pepperdine at gmail.com <mailto:kirk.pepperdine at gmail.com>> wrote:
>
> I can see the arrays being DVE’ed.. in 8_121. EA seems to be doing
> it’s job.
>
> Kind regards,
> Kirk
>
> > On May 25, 2017, at 9:03 PM, Vladimir Kozlov
> <vladimir.kozlov at oracle.com <mailto:vladimir.kozlov at oracle.com>>
> wrote:
> >
> > Hi Attila,
> >
> > What Java version you are using?
> >
> > I tried jdk 7, 8, 9.
> >
> > What I see is that in both cases only arrays are eliminated
> (-XX:+PrintEliminateAllocations with debug version of VM):
> >
> > BEGIN single
> > Scalar 73 AllocateArray === 51 46 47 8 1 ( 71 59
> 21 58 41 1 1 ) [[ 74 75 76 83 84 85 ]] rawptr:NotNull (
> int:>=0, java/lang/Object:NotNull *, bool, int ) NewMain::single @
> bci:9 !jvms: NewMain::single @ bci:9
> > ++++ Eliminated: 73 AllocateArray
> > END single
> > BEGIN multi
> > Scalar 116 AllocateArray === 91 86 87 8 1 ( 114 103
> 21 102 41 76 1 1 1 ) [[ 117 118 119 126 127 128 ]]
> rawptr:NotNull ( int:>=0, java/lang/Object:NotNull *, bool, int )
> NewMain::multi @ bci:17 !jvms: NewMain::multi @ bci:17
> > ++++ Eliminated: 116 AllocateArray
> > DONE
> >
> > But based on code non of objects should be allocated - both
> methods should have only 'return' generated.
> >
> > Looks like EA missing such case when objects are stored into
> small array.
> >
> > Thanks,
> > Vladimir
> >
> > On 5/25/17 9:16 AM, Hontvári Attila wrote:
> >> When creating a non-escaping array and putting a newly created,
> non-escaping object in it, the EA works, there are no heap
> allocations.
> >> private static void single() {
> >> Object x = new Object();
> >> Object[] array = new Object[]{x};
> >> Object a = array[0];
> >> }
> >> But if we do the same with two or more objects, the array will
> be allocated on the heap, and not eliminated.
> >> private static void multi() {
> >> Object x = new Object();
> >> Object y = new Object();
> >> Object[] array = new Object[]{x, y};
> >> Object a = array[0];
> >> Object b = array[1];
> >> }
> >> Is there a reason why it is only working in the first case?
> >> This would be useful for example,
> MethodHandle::invokeWithArguments, when the primitive types are
> boxed, and put into a varargs array, see my older email [1].
> >> A complete test source code is in [2], if we run it with
> -verbose:gc, we can see there are many GCs in the second case, but
> there are no GCs in the first case.
> >> [1]
> http://mail.openjdk.java.net/pipermail/jigsaw-dev/2017-January/010933.html
> <http://mail.openjdk.java.net/pipermail/jigsaw-dev/2017-January/010933.html>
> >> [2]
> https://gist.github.com/anonymous/bd46075ef1ebd858dae49fe6cfe39da8
> <https://gist.github.com/anonymous/bd46075ef1ebd858dae49fe6cfe39da8>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/attachments/20170526/a0cb5404/attachment-0001.html>
More information about the hotspot-compiler-dev
mailing list