-
Notifications
You must be signed in to change notification settings - Fork 5.8k
8296389: C2: PhaseCFG::convert_NeverBranch_to_Goto must handle both orders of successors #11481
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
Conversation
…rders of successors
👋 Welcome back epeter! A progress list of the required criteria for merging this PR into |
Webrevs
|
test/hotspot/jtreg/compiler/loopopts/TestPhaseCFGNeverBranchToGotoMain.java
Outdated
Show resolved
Hide resolved
test/hotspot/jtreg/compiler/loopopts/TestPhaseCFGNeverBranchToGotoMain.java
Outdated
Show resolved
Hide resolved
test/hotspot/jtreg/compiler/loopopts/TestPhaseCFGNeverBranchToGotoMain.java
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Much better, thanks for making these changes. Looks good.
@eme64 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:
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 25 new commits pushed to the
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 |
Co-authored-by: Tobias Hartmann <tobias.hartmann@oracle.com>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice analysis and tests! The fix looks good to me, too.
Thanks @chhagedorn @TobiHartmann for the reviews! |
Going to push as commit fabda24.
Your commit was automatically rebased without conflicts. |
The code in
PhaseCFG::convert_NeverBranch_to_Goto
looks like it is ready to haveidx == 1
, but it is not.We would read
succ
from_succs[1]
.jdk/src/hotspot/share/opto/block.cpp
Line 626 in 8c472e4
Then overwrite
_succs[0]
withsucc
, and shorten the array.jdk/src/hotspot/share/opto/block.cpp
Lines 635 to 636 in 8c472e4
And finally attempt to read
dead
from_succs[0]
, where the dead block used to be, but was just overwritten.jdk/src/hotspot/share/opto/block.cpp
Line 645 in 8c472e4
Solution
Read
dead
before overwriting it. I also made it more robust by going via the projections, and not assuming that the projections and successors are ordered equally (though that is probably guaranteed by the matching traversal).Refactoring: added class id for NeverBranch
I also added the class id for NeverBranch, and replaced all
Op_NeverBranch
checks withis_NeverBranch()
.Why did we never hit this bug before?
Normal case: during matching, "succ" projection is added as output of NeverBranch before the "dead" projection leading to Halt. Thus, the outputs of NeverBranch are normally [[ "succ", "dead" ]], hence
idx == 0
.Details: During DFS, usually we go from Halt to NeverBranch. Then via Region/Loop, take backedge, and find the "succ" edge. We already have its inputs (NeverBranch), thus we can now post-visit the live edge, and attach it to the NeverBranch first. Later, once we have processed the whole infinite loop, we post-visit out of NeverBranch to the "dead" projection edge, which we attach second.
Rare case: "dead" projection is first attached to NeverBranch, and "succ" projection is added second. We have [[ "dead", "succ" ]], hence
idx == 1
.We have a peeled infinite loop. The NeverBranch of the peeled iteration is first visited via the "dead" projection from HaltNode. Since the peeled iteration has no backedge, we do not visit the "succ" projection yet, but instead attach "dead" projection to HaltNode already once we are done visiting everything above. Later, we come from the peeled loop's NeverBranch exit, to the "succ" projection of the peeled iteration's NeverBranch, and attach the "succ" projection.
Progress
Issue
Reviewers
Reviewing
Using
git
Checkout this PR locally:
$ git fetch https://git.openjdk.org/jdk pull/11481/head:pull/11481
$ git checkout pull/11481
Update a local copy of the PR:
$ git checkout pull/11481
$ git pull https://git.openjdk.org/jdk pull/11481/head
Using Skara CLI tools
Checkout this PR locally:
$ git pr checkout 11481
View PR using the GUI difftool:
$ git pr show -t 11481
Using diff file
Download this PR as a diff file:
https://git.openjdk.org/jdk/pull/11481.diff