RFR: 8370200: Crash: assert(outer->outcnt() >= phis + 2 - be_loads && outer->outcnt() <= phis + 2 + stores + 1) failed: only phis [v4]
Emanuel Peter
epeter at openjdk.org
Fri Dec 12 13:15:00 UTC 2025
On Thu, 11 Dec 2025 15:46:40 GMT, Roland Westrelin <roland at openjdk.org> wrote:
>> The crash occurs because verification code expects the inner and outer
>> loop of a loop strip mining nest to have the same number of phis but,
>> in this case, the inner loop has one more memory phis than the outer
>> loop.
>>
>> 1) After `OuterStripMinedLoopNode::adjust_strip_mined_loop`, inner and
>> outer loops have the same number of phis, as expected.
>>
>>
>> 309 MergeMem === _ 1 306 1 1 284 [[ 429 ]] { - - N284:instptr:java/lang/Throwable (java/io/Serializable):BotPTR+20,iid=bot [narrow] } Memory: @ptr:BotPTR+bot, idx=Bot; !orig=205 !jvms: TestMismatchedMemoryPhis::mainTest @ bci:37 (line 49)
>>
>> 248 OuterStripMinedLoop === 248 321 247 [[ 248 249 428 429 430 ]]
>> 429 Phi === 248 309 205 [[ 93 ]] #memory Memory: @ptr:BotPTR+bot, idx=Bot; !orig=93 !jvms: TestMismatchedMemoryPhis::mainTest @ bci:37 (line 49)
>> 430 Phi === 248 306 121 [[ 94 ]] #memory Memory: @instptr:TestMismatchedMemoryPhis:BotPTR+16,iid=bot, name=l, idx=4; !orig=94 !jvms: TestMismatchedMemoryPhis::mainTest @ bci:37 (line 49)
>>
>> 249 CountedLoop === 249 248 197 [[ 249 119 96 93 94 ]] inner stride: 1 strip mined !orig=[223],[91] !jvms: TestMismatchedMemoryPhis::mainTest @ bci:37 (line 49)
>> 93 Phi === 249 429 205 [[ 117 97 ]] #memory Memory: @ptr:BotPTR+bot, idx=Bot; !jvms: TestMismatchedMemoryPhis::mainTest @ bci:37 (line 49)
>> 94 Phi === 249 430 121 [[ 97 ]] #memory Memory: @instptr:TestMismatchedMemoryPhis:BotPTR+16,iid=bot, name=l, idx=4; !jvms: TestMismatchedMemoryPhis::mainTest @ bci:37 (line 49)
>>
>>
>> 2) Then `PhiNode::Ideal` runs for 429 and pushed the `MergeMem` 309
>> through the outer loop phi:
>>
>>
>> 248 OuterStripMinedLoop === 248 321 247 [[ 248 249 428 429 430 444 446 ]]
>> 430 Phi === 248 306 121 [[ 94 ]] #memory Memory: @instptr:TestMismatchedMemoryPhis:BotPTR+16,iid=bot, name=l, idx=4; !orig=94 !jvms: TestMismatchedMemoryPhis::mainTest @ bci:37 (line 49)
>> 444 Phi === 248 306 121 [[ 445 ]] #memory Memory: @ptr:BotPTR+bot, idx=Bot; !orig=429,93 !jvms: TestMismatchedMemoryPhis::mainTest @ bci:37 (line 49)
>> 446 Phi === 248 284 170 [[ 445 ]] #memory Memory: @instptr:java/lang/Throwable (java/io/Serializable):BotPTR+20,iid=bot [narrow], name=detailMessage, idx=5; !orig=444,429,93 !jvms: TestMismatchedMemoryPhis::mainTest @ bci:37 (line 49)
>>
>> 445 MergeMem === _ 1 444 1 1 446 [[ 93 ]] { - - N446:instptr:java/lang/Throwable (java/io/Serializable):BotPTR+20,iid=bot [narrow] } Memory: @ptr:BotPTR+bot, idx...
>
> Roland Westrelin has updated the pull request incrementally with three additional commits since the last revision:
>
> - Update src/hotspot/share/opto/node.cpp
>
> Co-authored-by: Daniel Lundén <daniel.lunden at oracle.com>
> - Update test/hotspot/jtreg/compiler/loopstripmining/TestMismatchedMemoryPhis.java
>
> Co-authored-by: Daniel Lundén <daniel.lunden at oracle.com>
> - Update src/hotspot/share/opto/cfgnode.cpp
>
> Co-authored-by: Daniel Lundén <daniel.lunden at oracle.com>
src/hotspot/share/opto/cfgnode.cpp line 2701:
> 2699: }
> 2700: }
> 2701: }
Another drive-by question:
You are refactoring / fixing existing optimizations:
Are there IR tests that cover the original optimization? How do we avoid that we lose optimizations here?
test/hotspot/jtreg/compiler/loopstripmining/TestMismatchedMemoryPhis.java line 34:
> 32: * -XX:CompileCommand=compileonly,*TestMismatchedMemoryPhis*::mainTest -XX:-TieredCompilation
> 33: * -Xcomp -XX:+StressIGVN -XX:+StressLoopPeeling -XX:PerMethodTrapLimit=0 TestMismatchedMemoryPhis
> 34: * @run main TestMismatchedMemoryPhis
Suggestion:
* @run main ${test.main.class}
Optional nits, drive-by stile 😬
Possible since a new JTREG version. Also: you test does not have a package.
test/hotspot/jtreg/compiler/loopstripmining/TestMismatchedMemoryPhis.java line 62:
> 60: } catch (NullPointerException npe) {
> 61: // Expected
> 62: }
Could this exception be avoided, and still reproduce the bug?
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/28677#discussion_r2614168898
PR Review Comment: https://git.openjdk.org/jdk/pull/28677#discussion_r2614160478
PR Review Comment: https://git.openjdk.org/jdk/pull/28677#discussion_r2614162891
More information about the hotspot-compiler-dev
mailing list