RFR: 8281811: assert(_base == Tuple) failed: Not a Tuple after JDK-8280799
Roland Westrelin
roland at openjdk.java.net
Mon Feb 28 09:41:50 UTC 2022
On Wed, 16 Feb 2022 13:28:48 GMT, Roland Westrelin <roland at openjdk.org> wrote:
> The crash occurs because a Shenandoah barrier is expanded between the
> Start node and its control projection. One of the test cases I added
> also shows the same failure with a barrier expansion between a MemBar
> and its control projection. The barrier is expanded at the control
> that PhaseIdealLoop assigns to it.
>
> This code:
> https://github.com/openjdk/jdk/blob/master/src/hotspot/share/opto/loopnode.cpp#L5756
> I added back with JDK-8280799 is what's causing the incorrect
> placement of the barrier.
>
> The fix I propose is to skip that logic if the loop opts pass is for
> barrier expansion as there's no range check elimination then.
Thanks for looking at this.
> Could you explain what exactly is different in the GC specific loop opts pass that makes this code incorrect?
The shenandoah barrier is initially a floating macro node. It needs to be expanded to a series of tests and a call. Because it's floating, the usual macro expansion pass cannot be used. Instead, the barrier expansion logic relies on a loop opts pass that assigns control to the barriers. The control flow is then constructed at the barrier's control. That control needs to be a valid control but because of JDK-8280799, it's not always the case.
-------------
PR: https://git.openjdk.java.net/jdk/pull/7494
More information about the hotspot-compiler-dev
mailing list