[jdk19] RFR: 8289954: C2: Assert failed in PhaseCFG::verify() after JDK-8183390
Pengfei Li
pli at openjdk.org
Mon Jul 11 08:54:24 UTC 2022
Fuzzer tests report an assertion failure issue in C2 global code motion
phase. Git bisection shows the problem starts after our fix of post loop
vectorization (JDK-8183390). After some narrowing down work, we find it
is caused by below change in that patch.
@@ -422,14 +404,7 @@
cl->mark_passed_slp();
}
cl->mark_was_slp();
- if (cl->is_main_loop()) {
- cl->set_slp_max_unroll(local_loop_unroll_factor);
- } else if (post_loop_allowed) {
- if (!small_basic_type) {
- // avoid replication context for small basic types in programmable masked loops
- cl->set_slp_max_unroll(local_loop_unroll_factor);
- }
- }
+ cl->set_slp_max_unroll(local_loop_unroll_factor);
}
}
This change is in function `SuperWord::unrolling_analysis()`. AFAIK, it
helps find a loop's max unroll count via some analysis. In the original
code, we have loop type checks and the slp max unroll value is set for
only some types of loops. But in JDK-8183390, the check was removed by
mistake. In my current understanding, the slp max unroll value applies
to slp candidate loops only - either main loops or RCE'd post loops -
so that check shouldn't be removed. After restoring it we don't see the
assertion failure any more.
The new jtreg created in this patch can reproduce the failed assertion,
which checks `def_block->dominates(block)` - the domination relationship
of two blocks. But in the case, I found the blocks are in an unreachable
inner loop, which I think ought to be optimized away in some previous C2
phases. As I'm not quite familiar with the C2's global code motion, so
far I still don't understand how slp max unroll count eventually causes
that problem. This patch just restores the if condition which I removed
incorrectly in JDK-8183390. But I still suspect that there is another
hidden bug exists in C2. I would be glad if any reviewers can give me
some guidance or suggestions.
Tested hotspot::hotspot_all_no_apps, jdk::tier1~3 and langtools::tier1.
-------------
Commit messages:
- 8289954: C2: Assert failed in PhaseCFG::verify() after JDK-8183390
Changes: https://git.openjdk.org/jdk19/pull/130/files
Webrev: https://webrevs.openjdk.org/?repo=jdk19&pr=130&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8289954
Stats: 89 lines in 2 files changed: 88 ins; 0 del; 1 mod
Patch: https://git.openjdk.org/jdk19/pull/130.diff
Fetch: git fetch https://git.openjdk.org/jdk19 pull/130/head:pull/130
PR: https://git.openjdk.org/jdk19/pull/130
More information about the hotspot-compiler-dev
mailing list