Intermediate writes to array slot not eliminated by optimizer

Vitaly Davidovich vitalyd at gmail.com
Wed May 13 14:12:46 UTC 2015


Thanks Roland.  Did you by chance confirm this on your end? I wanted to
make sure this wasn't some artifact on my part.

Vitaly

On Wed, May 13, 2015 at 10:08 AM, Roland Westrelin <
roland.westrelin at oracle.com> wrote:

> Vitaly,
>
> I filed:
>
> https://bugs.openjdk.java.net/browse/JDK-8080289
>
> Roland.
>
>
> > On May 12, 2015, at 7:56 PM, Vitaly Davidovich <vitalyd at gmail.com>
> wrote:
> >
> > Well, this seems more about detecting that each iteration of the loop is
> storing to the same address, which means if the loop is counted (or
> otherwise determined to end), then only final value can be stored.  Even if
> loop is not removed entirely and the final value computed statically (as
> one could conceive in this case), I'd think working with a temp inside the
> loop and then storing the temp value into memory would be good as well.
> >
> > FWIW, gcc and llvm do the "right" thing here in similarly shaped C++
> code :).
> >
> > On Tue, May 12, 2015 at 1:47 PM, Vladimir Kozlov <
> vladimir.kozlov at oracle.com> wrote:
> > The most important thing we need do with this code is move Store from
> the loop. We definitely collapse empty loops.
> > We do move some loop invariant nodes from loops but this case could be
> different. I think the problem is stored value is loop variant.
> > Yes, it would benefit in general if we could move such stores from loops.
> >
> > Vladimir
> >
> > On 5/12/15 10:16 AM, Vitaly Davidovich wrote:
> > Thanks Vladimir.  I believe I did see the split pre/main/post loop form
> > in the compiled code; I tried it with both increment and decrement, and
> > also a plain counted for loop, but same asm in the end.  Clearly the
> > example I gave is just for illustrating the point, but perhaps this type
> > of code can be left behind after some other optimization passes
> > complete.  Do you think it's worth handling these types of things?
> >
> > On Tue, May 12, 2015 at 1:12 PM, Vladimir Kozlov
> > <vladimir.kozlov at oracle.com <mailto:vladimir.kozlov at oracle.com>> wrote:
> >
> >     I would need to look on ideal graph to find what is going on.
> >     My guess is that the problem is Store node has control edge pointing
> >     to loop head so we can't move it from loop. Or stupid staff like we
> >     only do it for index increment and not for decrement (which I doubt).
> >
> >     Most possible scenario is we convert this loop to canonical Counted
> >     and split it (creating 3 loops: pre, main, post) before we had a
> >     chance to collapse it.
> >
> >     Regards,
> >     Vladimir
> >
> >     On 5/12/15 10:05 AM, Vitaly Davidovich wrote:
> >
> >         Anyone? :)
> >
> >         Thanks
> >
> >         On Mon, May 11, 2015 at 8:25 PM, Vitaly Davidovich
> >         <vitalyd at gmail.com <mailto:vitalyd at gmail.com>
> >         <mailto:vitalyd at gmail.com <mailto:vitalyd at gmail.com>>> wrote:
> >
> >              Hi guys,
> >
> >              Suppose we have the following code:
> >
> >              private static final long[] ARR = new long[10];
> >              private static final int ITERATIONS = 500 * 1000 * 1000;
> >
> >
> >              static void loop() {
> >                   int i = ITERATIONS;
> >                   while(--i >= 0) {
> >                        ARR[4] = i;
> >                    }
> >              }
> >
> >              My expectation would be that loop() effectively compiles to:
> >              ARR[4] = 0;
> >              ret;
> >
> >              However, an actual loop is compiled.  This example is a
> >         reduction of
> >              a slightly more involved case that I had in mind, but I'm
> >         curious if
> >              I'm missing something here.
> >
> >              I tested this with 8u40 and tiered compilation disabled,
> >         for what
> >              it's worth.
> >
> >              Thanks
> >
> >
> >
> >
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/attachments/20150513/46edf70f/attachment.html>


More information about the hotspot-compiler-dev mailing list