...and another one
Benoit Daloze
eregontp at gmail.com
Fri Nov 18 18:33:22 UTC 2016
Just curious, did you run the full jcstress suite?
I guess it would reveal a few problems due to missing barriers currently.
On Fri, Nov 18, 2016 at 7:14 PM, Andrew Haley <aph at redhat.com> wrote:
> I think this one is even more interesting than the store barrier
> problem.
>
> public volatile Object referent;
> public final WeakReference<Object> ref;
> public final ReferenceQueue<Object> refQueue;
>
> public WeakReferenceTest() {
> referent = new Object();
> refQueue = new ReferenceQueue<>();
> ref = new WeakReference<>(referent, refQueue);
> }
>
> @Actor
> public void actor1() {
> while (ref.get() != null) {
> // burn!
> }
> }
>
> So, actor1 is spinning in a loop, waiting for ref.get() to become
> null. This won't happen until a GC, and this will be a safepoint.
> However, the code Graal generates is:
>
> 0x0000007f8546e5f0: mov x0, #0x7000 // #28672
> ; {poll}
> 0x0000007f8546e5f4: movk x0, #0x926b, lsl #16
> 0x0000007f8546e5f8: movk x0, #0x7f, lsl #32 ;
> ImmutableOopMap{c_rarg1=Oop }
> ;*aload_0 {reexecute=1
> rethrow=0 return_oop=0}
> ; -
> org.openjdk.jcstress.tests.interrupt.WeakReferenceTest::actor1 at 0 (line 63)
>
> 0x0000007f8546e5fc: ldr wzr, [x0] ; {poll}
> 0x0000007f8546e600: b 0x0000007f8546e5f0
>
> Wow! This is an infinite loop with a safepoint check in the middle.
> Graal apparently doesn't believe that values can change from non-null
> at a safepoint. C2 seems to treat safepoints specially in this
> regard.
>
> Yes, I'll file a bug report. Is it the case that effectively all of
> the discussion about Graal bugs goes into the Github bug discussions?
>
> Andrew.
>
More information about the graal-dev
mailing list