RFR: 8293833: Error mixing types with -XX:+UseCMoveUnconditionally -XX:+UseVectorCmov
Fei Gao
fgao at openjdk.org
Mon Oct 10 06:26:16 UTC 2022
After JDK-8139340, JDK-8192846 and JDK-8289422, we can vectorize
the case below by enabling -XX:+UseCMoveUnconditionally and
-XX:+UseVectorCmov:
// double[] a, double[] b, double[] c;
for (int i = 0; i < a.length; i++) {
c[i] = (a[i] > b[i]) ? a[i] : b[i];
}
But we don't support the case like:
// double[] a;
// int seed;
for (int i = 0; i < a.length; i++)
a[i] = (i % 2 == 0) ? seed + i : seed - i;
}
because the IR nodes for the CMoveD in the loop is:
AddI AndI AddD SubD
\ / / /
CmpI / /
\ / /
Bool / /
\ / /
CMoveD
and it is not our target pattern, which requires that the inputs
of Cmp node must be the same as the inputs of CMove node
as commented in CMoveKit::make_cmovevd_pack(). Because
we can't vectorize the CMoveD pack, we shouldn't vectorize
its inputs, AddD and SubD. But the current function
CMoveKit::make_cmovevd_pack() doesn't clear the unqualified
CMoveD pack from the packset. In this way, superword wrongly
vectorizes AddD and SubD. Finally, we get a scalar CMoveD
node with two vector inputs, AddVD and SubVD, which has
wrong mixing types, then the assertion fails.
To fix it, we need to remove the unvectorized CMoveD pack
from the packset and clear related map info.
-------------
Commit messages:
- 8293833: Error mixing types with -XX:+UseCMoveUnconditionally -XX:+UseVectorCmov
Changes: https://git.openjdk.org/jdk/pull/10627/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=10627&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8293833
Stats: 61 lines in 4 files changed: 42 ins; 5 del; 14 mod
Patch: https://git.openjdk.org/jdk/pull/10627.diff
Fetch: git fetch https://git.openjdk.org/jdk pull/10627/head:pull/10627
PR: https://git.openjdk.org/jdk/pull/10627
More information about the hotspot-compiler-dev
mailing list