-
Notifications
You must be signed in to change notification settings - Fork 6.1k
8357105: C2: compilation fails with "assert(false) failed: empty program detected during loop optimization" #25395
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
👋 Welcome back dskantz! A progress list of the required criteria for merging this PR into |
@danielogh 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 50 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 |
@danielogh The following label will be automatically applied to this pull request:
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. |
Webrevs
|
public class TestStackedConcatsAppendUncommonTrap { | ||
|
||
public static void main (String... args) { | ||
for (int i = 0; i < 1_000_000; i ++) { |
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.
How about i ++
replaced as i++
. The whitespace seems do not need.
|
||
public static void main (String... args) { | ||
for (int i = 0; i < 1_000_000; i ++) { | ||
f(" "); |
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.
Should we use the function return value, to avoid the compiler do the dead code elimination optimization
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.
The overall analysis and fix look good to me, I just have some minor style, test, and code comment suggestions.
* @summary Test stacked string concatenations where the toString result | ||
* of the first StringBuilder chain is wired into an uncommon trap | ||
* located in the second one. | ||
* @run main/othervm compiler.stringopts.TestStackedConcatsAppendUncommonTrap |
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.
Please add a second run that is constrained via JVM flags to be more stable and easier to analyze, using -Xbatch
, -XX:CompileOnly=...
, and perhaps -XX:-TieredCompilation
. Using -Xbatch
also allows you to reduce the number of warm-up iterations, many tests use 10_000
.
Co-authored-by: Roberto Castañeda Lozano <[email protected]>
Co-authored-by: Roberto Castañeda Lozano <[email protected]>
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.
LGTM
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.
Looks good, thanks! Please re-run testing of your latest changes (if you haven't yet) before integration.
Thanks for the reviews and suggestions! |
/integrate |
Going to push as commit a300c35.
Your commit was automatically rebased without conflicts. |
@danielogh Pushed as commit a300c35. 💡 You may see a message that your pull request was closed with unmerged commits. This can be safely ignored. |
This pull request contains a fix for JDK-8357105.
The problem is performing stacked string concatenation optimization between a pair of StringBuilder.append().toString()-links SB1 and SB2, where the parameter of an append call in SB2 has a complex dependency on the result of SB1, which in turn is replaced by top() during stringopts -- similar to JDK-8271341, which had a diamond if-structure using the result of SB1, while in this case the use is an unstable If. In the attached regression test, a live part of the graph gets optimized away during later phases and ultimately the whole graph vanishes.
The proposed solution is to simply exclude this specific case. This bug has existed for a long time and stacked concats is a niche optimization.
Testing:
Tier1-4.
Extra testing:
Ran Tier1-4 with an instrumented build and observed that we do not disable stacked concatenation in any previously known case after the fix.
Progress
Issue
Reviewers
Reviewing
Using
git
Checkout this PR locally:
$ git fetch https://git.openjdk.org/jdk.git pull/25395/head:pull/25395
$ git checkout pull/25395
Update a local copy of the PR:
$ git checkout pull/25395
$ git pull https://git.openjdk.org/jdk.git pull/25395/head
Using Skara CLI tools
Checkout this PR locally:
$ git pr checkout 25395
View PR using the GUI difftool:
$ git pr show -t 25395
Using diff file
Download this PR as a diff file:
https://git.openjdk.org/jdk/pull/25395.diff
Using Webrev
Link to Webrev Comment