RFR: 8293833: Error mixing types with -XX:+UseCMoveUnconditionally -XX:+UseVectorCmov

Christian Hagedorn chagedorn at openjdk.org
Mon Oct 10 09:26:57 UTC 2022


On Mon, 10 Oct 2022 06:12:11 GMT, Fei Gao <fgao at openjdk.org> wrote:

> 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.

test/hotspot/jtreg/compiler/c2/TestCondAddDeadBranch.java line 32:

> 30:  * @run main/othervm -Xcomp -XX:-TieredCompilation -XX:CompileOnly=TestCondAddDeadBranch TestCondAddDeadBranch
> 31:  * @run main/othervm -Xcomp -XX:-TieredCompilation -XX:CompileOnly=TestCondAddDeadBranch
> 32:  *                   -XX:+UseCMoveUnconditionally -XX:+UseVectorCmov -XX:MaxVectorSize=32  TestCondAddDeadBranch

As the cmove flags are C2 specific, we should also add a `@requires vm.compiler2.enabled`. Same for the other test.

-------------

PR: https://git.openjdk.org/jdk/pull/10627


More information about the hotspot-compiler-dev mailing list