8323727: [REDO] C2 compilation fails with assert(verify(phase)) failed: missing Value() optimization #26861
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This is a draft PR meant for discussion.
Issue summary
The bug is reproducible with the following code
The type
compiler/types/TestSubTypeOfAbstractClass$A
originates from theTypeFunc
of theCallStaticJavaNode
.During parsing of
instanceof
, inGraphKit::gen_instanceof
, we generate two branches for the LHS (one for the case where it is null, one for the other case). In the not nullbranch, we end up with a
CastPPNode
that gets assigned the impossible typeTestSubTypeOfAbstractClass$A:NotNull
.This then becomes a problem in
SubTypeCheckNode::verify
. There, we compare the result of callingValue
on theSubTypeCheckNode
and performing the sub type check witha pointer comparison. For
Value
, we end up inSubTypeCheckNode::sub
. There, we detect that theclass on the RHS does not have any subclass (we add a compile dependency for that) and return
TypeInt::CC_GT
(which isfalse
).However, when doing the pointer comparison we compute the class of the LHS with
LoadKlass
, and then compare it to the class on theRHS with
CmpPNode
. This constant folds toTypeInt::CC_EQ
(true
) as the type of the LHS isTestSubTypeOfAbstractClass$A:NotNull
.These two results contradict each other, which results in hitting the assert. However they are both correct in a way, as this path
will never be executed anyway.
A previous attempt at fixing this issue was made, but was later backed out because it caused a regression.
Progress
Issue
Reviewing
Using
git
Checkout this PR locally:
$ git fetch https://git.openjdk.org/jdk.git pull/26861/head:pull/26861
$ git checkout pull/26861
Update a local copy of the PR:
$ git checkout pull/26861
$ git pull https://git.openjdk.org/jdk.git pull/26861/head
Using Skara CLI tools
Checkout this PR locally:
$ git pr checkout 26861
View PR using the GUI difftool:
$ git pr show -t 26861
Using diff file
Download this PR as a diff file:
https://git.openjdk.org/jdk/pull/26861.diff