RFR: 8288294: [vector] Add Identity/Ideal transformations for vector logic operations

Vladimir Kozlov kvn at openjdk.org
Thu Jun 30 02:45:33 UTC 2022


On Mon, 20 Jun 2022 07:50:09 GMT, Xiaohong Gong <xgong at openjdk.org> wrote:

> This patch adds the following transformations for vector logic operations such as "`AndV, OrV, XorV`", incuding:
> 
>   (AndV v (Replicate m1))   => v
>   (AndV v (Replicate zero)) => Replicate zero
>   (AndV v v)                => v
> 
>   (OrV v (Replicate m1))    => Replicate m1
>   (OrV v (Replicate zero))  => v
>   (OrV v v)                 => v
> 
>   (XorV v v)                => Replicate zero
> 
> where "`m1`" is the integer constant -1, together with the same optimizations for vector mask operations like "`AndVMask, OrVMask, XorVMask`".

src/hotspot/share/opto/vectornode.cpp line 1802:

> 1800:   // (AndV (Replicate zero) src)   => (Replicate zero)
> 1801:   // (AndVMask (MaskAll zero) src) => (MaskAll zero)
> 1802:   if (VectorNode::is_all_zeros_vector(in(1))) {

Why you expect it to be `in(1)` instead of `in(2)` as in previous case? Do we create inputs in such order based on mask value?
At least add comment explaining it.

src/hotspot/share/opto/vectornode.cpp line 1838:

> 1836:   // (OrV src (Replicate zero))   => src
> 1837:   // (OrVMask src (MaskAll zero)) => src
> 1838:   if (VectorNode::is_all_zeros_vector(in(2))) {

The same question as for `AndVNode`.

src/hotspot/share/opto/vectornode.cpp line 1869:

> 1867:   // (XorV src src)      => (Replicate zero)
> 1868:   // (XorVMask src src)  => (MaskAll zero)
> 1869:   //

Do we really need this? Is `Replicate` asm instruction faster than `XorV`? I understand it may help reduce registers pressure.

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

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


More information about the hotspot-compiler-dev mailing list