RFR: 8263227: C2: inconsistent spilling due to dead nodes in exception block
Vladimir Kozlov
kvn at openjdk.java.net
Tue Apr 6 17:58:34 UTC 2021
On Thu, 1 Apr 2021 10:02:39 GMT, Roberto Castañeda Lozano <rcastanedalo at openjdk.org> wrote:
> This change eliminates dead multi-nodes created by call-catch cleanup after GCM. Eliminating all dead code created by call-catch cleanup avoids potential issues when splitting the live range of call result values, see the analysis in the [bug report](https://bugs.openjdk.java.net/browse/JDK-8263227) for details. This solution is the least invasive of the three alternatives proposed in the bug report (the other two are constraining global code motion and extending live-range splitting).
>
> The change also extends the control-flow graph verification pass to catch similar live-range splitting issues earlier (with `+VerifyRegisterAllocator`).
>
> Tested on:
> - original bug reproducer
> - hs-tier1-5 (windows-x64, linux-x64, linux-aarch64, and macosx-x64) with `+VerifyRegisterAllocator`
> - hs-tier1-3 (windows-x64, linux-x64, linux-aarch64, and macosx-x64) with `+VerifyRegisterAllocator` and `+StressGCM` (5 repetitions)
src/hotspot/share/opto/lcm.cpp line 1415:
> 1413: if (dead) {
> 1414: // Remove projections if n is a dead multi-node.
> 1415: for (uint k = j + n->outcnt(); sb->get_node(k)->is_Proj(); k--) {
I don't get this logic. The loop is not executed if sb->get_node(j + n->outcnt()) is not Proj node.
src/hotspot/share/opto/lcm.cpp line 1419:
> 1417: "dead projection should correspond to current node");
> 1418: sb->get_node(k)->disconnect_inputs(C);
> 1419: sb->remove_node(k);
If you remove node here then `j` could be incorrect in `sb->remove_node(j)` at line #1424
-------------
PR: https://git.openjdk.java.net/jdk/pull/3303
More information about the hotspot-compiler-dev
mailing list