RFR: 8267399: C2: java/text/Normalizer/ConformanceTest.java test failed with assertion
Roland Westrelin
roland at openjdk.java.net
Mon Jun 7 12:00:23 UTC 2021
This was found with Shenandoah but has nothing specific to Shenandoah.
For the inner loop of the test case:
- the loop limit, len, is known to be either 1 or 2. As a consequence
the type of the iv phi is set to [0..2].
- range check elimination is applied which causes the pre/main/post
loops to be added and the limit of the main loop to be adjusted. C2
computes the limit of the main loop as TypeINT:INT.
- the main loop is peeled. So now the type of the iv phi is 2 and it
constant folds. Because the main loop limit has type TypeInt::INT,
the exit condition of the loop doesn't constant fold. But the loop
no longer has the shape of a counted loop because the iv phi doesn't
exist anymore.
The crash then occurs when some other loop opts is attempted and loop
strip mining verification code checks that the shape of the main loop
is that of a counted loop.
The fix I propose is to add a CastII at range elimination time that
captures the bounds of the limit before RC is applied. This way the
type of the limit is not lost and the main loop backbranch can be
properly eliminated in the chain of events above.
-------------
Commit messages:
- fix
Changes: https://git.openjdk.java.net/jdk/pull/4388/files
Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=4388&range=00
Issue: https://bugs.openjdk.java.net/browse/JDK-8267399
Stats: 72 lines in 2 files changed: 72 ins; 0 del; 0 mod
Patch: https://git.openjdk.java.net/jdk/pull/4388.diff
Fetch: git fetch https://git.openjdk.java.net/jdk pull/4388/head:pull/4388
PR: https://git.openjdk.java.net/jdk/pull/4388
More information about the hotspot-compiler-dev
mailing list