Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

8263227: C2: inconsistent spilling due to dead nodes in exception block #3303

Closed
wants to merge 10 commits into from

Conversation

@robcasloz
Copy link
Contributor

@robcasloz robcasloz commented Apr 1, 2021

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 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)

Progress

  • Change must not contain extraneous whitespace
  • Commit message must refer to an issue
  • Change must be properly reviewed

Issue

  • JDK-8263227: C2: inconsistent spilling due to dead nodes in exception block

Reviewers

Reviewing

Using git

Checkout this PR locally:
$ git fetch https://git.openjdk.java.net/jdk pull/3303/head:pull/3303
$ git checkout pull/3303

Update a local copy of the PR:
$ git checkout pull/3303
$ git pull https://git.openjdk.java.net/jdk pull/3303/head

Using Skara CLI tools

Checkout this PR locally:
$ git pr checkout 3303

View PR using the GUI difftool:
$ git pr show -t 3303

Using diff file

Download this PR as a diff file:
https://git.openjdk.java.net/jdk/pull/3303.diff

@bridgekeeper
Copy link

@bridgekeeper bridgekeeper bot commented Apr 1, 2021

👋 Welcome back rcastanedalo! A progress list of the required criteria for merging this PR into master will be added to the body of your pull request. There are additional pull request commands available for use with this pull request.

@openjdk
Copy link

@openjdk openjdk bot commented Apr 1, 2021

@robcasloz The following label will be automatically applied to this pull request:

  • hotspot-compiler

When this pull request is ready to be reviewed, an "RFR" email will be sent to the corresponding mailing list. If you would like to change these labels, use the /label pull request command.

@robcasloz robcasloz marked this pull request as ready for review Apr 6, 2021
@openjdk openjdk bot added the rfr label Apr 6, 2021
@mlbridge
Copy link

@mlbridge mlbridge bot commented Apr 6, 2021

Webrevs

Copy link
Contributor

@neliasso neliasso left a comment

Looks good!

@openjdk
Copy link

@openjdk openjdk bot commented Apr 6, 2021

@robcasloz This change now passes all automated pre-integration checks.

ℹ️ This project also has non-automated pre-integration requirements. Please see the file CONTRIBUTING.md for details.

After integration, the commit message for the final commit will be:

8263227: C2: inconsistent spilling due to dead nodes in exception block

Eliminate dead nodes created by call-catch cleanup even if they have multiple
projections. Assert that definitions dominate uses and projections are scheduled
next to their parent nodes.

Reviewed-by: neliasso, kvn

You can use pull request commands such as /summary, /contributor and /issue to adjust it as needed.

At the time when this comment was updated there had been 510 new commits pushed to the master branch:

  • a25bae8: 8261445: Use memory_order_relaxed for os::random().
  • 5136643: 8262725: IGV: crash when removing all graphs in a group
  • 79798c6: 8265136: ZGC: Expose GarbageCollectorMXBeans for both pauses and cycles
  • f1d4ae6: 8263718: unused-result warning happens at os_linux.cpp
  • 787908c: 8264221: Rewrite confusing stream API chain in SnippetMaps
  • 142edd3: 8265152: jpackage cleanup fails on Windows with IOException deleting msi
  • ab22407: 8265486: ProblemList javax/sound/midi/Sequencer/Recording.java on macosx-aarch64
  • e0fd5fc: 8265028: JDWP debug agent thread lookup can be made faster
  • 713483c: 8265373: Change to GCC 10.3 for building on Linux at Oracle
  • 3990713: 8265463: ProblemList vmTestbase/vm/mlvm/mixed/stress/regression/b6969574/INDIFY_Test.java on Win-X64 -Xcomp
  • ... and 500 more: https://git.openjdk.java.net/jdk/compare/d1baed677e30d33522033c2205138b33e8d392b6...master

As there are no conflicts, your changes will automatically be rebased on top of these commits when integrating. If you prefer to avoid this automatic rebasing, please check the documentation for the /integrate command for further details.

➡️ To integrate this PR with the above commit message to the master branch, type /integrate in a new comment.

@openjdk openjdk bot added the ready label Apr 6, 2021
@neliasso
Copy link
Contributor

@neliasso neliasso commented Apr 6, 2021

And thanks for the PDF with the excellent walk through!

@robcasloz
Copy link
Contributor Author

@robcasloz robcasloz commented Apr 6, 2021

Looks good!

Thanks for reviewing, Nils!

src/hotspot/share/opto/lcm.cpp Outdated Show resolved Hide resolved
Copy link
Contributor

@vnkozlov vnkozlov left a comment

Also where is guarantee that all Proj users are in the same block.

@robcasloz
Copy link
Contributor Author

@robcasloz robcasloz commented Apr 8, 2021

Also where is guarantee that all Proj users are in the same block.

Isn't this guaranteed by PhaseCFG::schedule_node_into_block()?

//----------------------------schedule_node_into_block-------------------------
// Insert node n into block b. Look for projections of n and make sure they
// are in b also.
void PhaseCFG::schedule_node_into_block( Node *n, Block *b ) {
// Set basic block of n, Add n to b,
map_node_to_block(n, b);
b->add_inst(n);
// After Matching, nearly any old Node may have projections trailing it.
// These are usually machine-dependent flags. In any case, they might
// float to another block below this one. Move them up.
for (DUIterator_Fast imax, i = n->fast_outs(imax); i < imax; i++) {
Node* use = n->fast_out(i);
if (use->is_Proj()) {
Block* buse = get_block_for_node(use);
if (buse != b) { // In wrong block?
if (buse != NULL) {
buse->find_remove(use); // Remove from wrong block
}
map_node_to_block(use, b);
b->add_inst(use);
}
}
}
}

I will run some tests with extra assertions in PhaseCFG::verify() to double-check.

@vnkozlov
Copy link
Contributor

@vnkozlov vnkozlov commented Apr 8, 2021

Also where is guarantee that all Proj users are in the same block.

Isn't this guaranteed by PhaseCFG::schedule_node_into_block()?

I will run some tests with extra assertions in PhaseCFG::verify() to double-check.

Okay.

@robcasloz
Copy link
Contributor Author

@robcasloz robcasloz commented Apr 12, 2021

Also where is guarantee that all Proj users are in the same block.

Isn't this guaranteed by PhaseCFG::schedule_node_into_block()?
I will run some tests with extra assertions in PhaseCFG::verify() to double-check.

Okay.

Done, see results in the related discussion (#3303 (comment)).

@mlbridge
Copy link

@mlbridge mlbridge bot commented Apr 20, 2021

Mailing list message from Roberto Casta=c3=b1eda Lozano on hotspot-compiler-dev:

On 2021-04-19 19:10, Vladimir Kozlov wrote:

Marked as reviewed by kvn (Reviewer).

Thanks for reviewing, Vladimir!

1 similar comment
@mlbridge
Copy link

@mlbridge mlbridge bot commented Apr 20, 2021

Mailing list message from Roberto Casta=c3=b1eda Lozano on hotspot-compiler-dev:

On 2021-04-19 19:10, Vladimir Kozlov wrote:

Marked as reviewed by kvn (Reviewer).

Thanks for reviewing, Vladimir!

Copy link
Contributor

@neliasso neliasso left a comment

Looks good!

@robcasloz
Copy link
Contributor Author

@robcasloz robcasloz commented Apr 20, 2021

Looks good!

Thanks again, Nils.

@robcasloz
Copy link
Contributor Author

@robcasloz robcasloz commented Apr 20, 2021

/summary
Eliminate dead nodes created by call-catch cleanup even if they have multiple
projections. Assert that definitions dominate uses and projections are scheduled
next to their parent nodes.

@openjdk
Copy link

@openjdk openjdk bot commented Apr 20, 2021

@robcasloz Setting summary to:

Eliminate dead nodes created by call-catch cleanup even if they have multiple
projections. Assert that definitions dominate uses and projections are scheduled
next to their parent nodes.
@robcasloz
Copy link
Contributor Author

@robcasloz robcasloz commented Apr 20, 2021

/integrate

@openjdk openjdk bot closed this Apr 20, 2021
@openjdk openjdk bot added integrated and removed ready rfr labels Apr 20, 2021
@openjdk
Copy link

@openjdk openjdk bot commented Apr 20, 2021

@robcasloz Since your change was applied there have been 510 commits pushed to the master branch:

  • a25bae8: 8261445: Use memory_order_relaxed for os::random().
  • 5136643: 8262725: IGV: crash when removing all graphs in a group
  • 79798c6: 8265136: ZGC: Expose GarbageCollectorMXBeans for both pauses and cycles
  • f1d4ae6: 8263718: unused-result warning happens at os_linux.cpp
  • 787908c: 8264221: Rewrite confusing stream API chain in SnippetMaps
  • 142edd3: 8265152: jpackage cleanup fails on Windows with IOException deleting msi
  • ab22407: 8265486: ProblemList javax/sound/midi/Sequencer/Recording.java on macosx-aarch64
  • e0fd5fc: 8265028: JDWP debug agent thread lookup can be made faster
  • 713483c: 8265373: Change to GCC 10.3 for building on Linux at Oracle
  • 3990713: 8265463: ProblemList vmTestbase/vm/mlvm/mixed/stress/regression/b6969574/INDIFY_Test.java on Win-X64 -Xcomp
  • ... and 500 more: https://git.openjdk.java.net/jdk/compare/d1baed677e30d33522033c2205138b33e8d392b6...master

Your commit was automatically rebased without conflicts.

Pushed as commit d81b046.

💡 You may see a message that your pull request was closed with unmerged commits. This can be safely ignored.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
3 participants