RFR: 8286125: C2: "bad AD file" with PopulateIndex on x86_64
Pengfei Li
pli at openjdk.java.net
Sat May 7 13:31:20 UTC 2022
A fuzzer test reports an assertion failure issue with PopulateIndexNode
on x86_64. It can be reproduced by the new jtreg case inside this patch.
Root cause is that C2 superword creates a PopulateIndexNode by mistake
while vectorizing below loop.
for (int i = 304; i > 15; i -= 3) {
int c = 16;
do {
for (int t = 1; t < 1; t++) {}
arr[c + 1] >>= i;
} while (--c > 0);
}
This is a corner loop case with redundant code inside. After several C2
optimizations, the do-while loop inside is unrolled and then isomorphic
right shift statements can be combined in the superword optimization.
Since all shift counts are the same loop IV value `i`, superword should
generate a RShiftCntVNode to create a vector of scalar replications of
the loop IV. But after JDK-8280510, a PopulateIndexNode is generated by
mistake because of the `opd == iv()` condition.
To fix this, we add a `have_same_inputs` condition here checking if all
inputs at position `opd_idx` of nodes in the pack are the same. If true,
C2 code should NOT run into this block to generate a PopulateIndexNode.
Instead, it should run into the next block for scalar replications.
Additionally, only adding this condition here is still not good enough
because it breaks the experimental post loop vectorization. As in post
loops, all packs are singleton, i.e., `have_same_inputs` is always true.
Hence, we also add a pack size check here to make post loop logic run
into this block. It's safe to let it go because post loop never needs
scalar replications of the loop IV - it never combines nodes in packs.
We also add two more assertions in the code.
Jtreg hotspot::hotspot_all_no_apps, jdk::tier1~3 and langtools::tier1
are tested and no issue is found.
-------------
Commit messages:
- 8286125: C2: "bad AD file" with PopulateIndex on x86_64
Changes: https://git.openjdk.java.net/jdk/pull/8587/files
Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=8587&range=00
Issue: https://bugs.openjdk.java.net/browse/JDK-8286125
Stats: 67 lines in 2 files changed: 64 ins; 0 del; 3 mod
Patch: https://git.openjdk.java.net/jdk/pull/8587.diff
Fetch: git fetch https://git.openjdk.java.net/jdk pull/8587/head:pull/8587
PR: https://git.openjdk.java.net/jdk/pull/8587
More information about the hotspot-compiler-dev
mailing list