On Wed, 15 Jul 2026 06:57:23 GMT, Eric Fang <[email protected]> wrote:

>> This PR introduces the basic Ideal/Identity transformations for 
>> `VectorBlendNode`.
>> 
>> The semantic of `VectorBlend(X, Y, M)` is: `M ? Y : X`.
>> 
>> **Identity**:
>> 
>>   (VectorBlend X Y (Replicate -1)) => Y
>>   (VectorBlend X Y (MaskAll   -1)) => Y
>>   (VectorBlend X Y (Replicate  0)) => X
>>   (VectorBlend X Y (MaskAll    0)) => X
>> 
>> 
>> **Ideal**:
>> 
>>   (VectorBlend (VectorBlend X A M) B M)  => (VectorBlend X B M)
>>   (VectorBlend A (VectorBlend B X M) M)  => (VectorBlend A X M)
>>   (VectorBlend A B (XorV/XorVMask M -1)) => (VectorBlend B A M)
>> 
>> 
>> Also corrects the VectorBlendNode header comment: across all backends (X86 
>> SSE/AVX, AArch64 NEON/SVE, RISC-V V) the active mask lane selects `vec2` 
>> (in(2)), and the inactive lane selects `vec1` (in(1)).
>> 
>> JTReg and JMH tests are also added for each optimization pattern. All tests 
>> (tier1, tier2, and tier3) passed on AArch64 and X86 platforms.
>> 
>> JMH benchmark test results:
>> 
>> On a Nvidia Grace (Neoverse-V2) machine with 128-bit SVE2:
>> 
>> Benchmark                    Unit    Before  Error   After           Error   
>> Uplift
>> blendNegatedMaskInt      ops/ms      7990.6  2.8         10215.2             
>> 11.0    1.3
>> identityAllOnesInt       ops/ms      3574.8  2.6         7967.1              
>> 0.3         2.2
>> identityAllZerosLong ops/ms  3575.6  1.0         7966.0              3.6     
>>     2.2
>> nestedBlendInnerLong ops/ms  3533.8  2.8         478573.0    3178.5  135.4
>> nestedBlendOuterInt      ops/ms      3537.6  3.4         472242.2    3034.2  
>> 133.5
>> 
>> 
>> On an AWS Graviton3 (Neoverse-V1) machine with 256-bit SVE1:
>> 
>> Benchmark                    Unit    Before  Error   After           Error   
>> Uplift
>> blendNegatedMaskInt      ops/ms      5171.9  5.2         8129.0              
>> 17.3    1.6
>> identityAllOnesInt       ops/ms      2722.0  0.1         5891.3              
>> 0.1         2.2
>> identityAllZerosLong ops/ms  2722.4  0.1         5891.1              0.3     
>>     2.2
>> nestedBlendInnerLong ops/ms  2697.6  0.0         312148.7    2366.4  115.7
>> nestedBlendOuterInt      ops/ms      2702.7  0.1         308686.0    2709.8  
>> 114.2
>> 
>> 
>> On a Nvidia Grace (Neoverse-V2) machine with `-XX:UseSVE=0`:
>> 
>> Benchmark                    Unit    Before  Error   After           Error   
>> Uplift
>> blendNegatedMaskInt      ops/ms      7718.1  1.9         9515.9              
>> 54.0    1.2
>> identityAllOnesInt       ops/ms      3581.9  0.6         8062.5              
>> 0.5         2.3
>> identityAllZerosLong ops/ms  3582.7  0.6         8058.5              11.9    
>> 2.2
>> nestedBlendInnerLong ops/ms  3529.6  1.4         476029.8    5190.2  134.9
>> nestedBlendOuterInt      ops/ms      3536.9  2.1         486060.0    3442.1  
>> 137.4
>> 
>> 
>> On an AMD EPYC 9124 16-Core Processor with option `-XX:UseAVX=3`:
>> 
>> Benchmark                    Unit    Before  Error   After           Error   
>> Uplift
>> blendNegatedMaskInt      ops/ms...
>
> Eric Fang has updated the pull request with a new target base due to a merge 
> or a rebase. The incremental webrev excludes the unrelated changes brought in 
> by the merge/rebase. The pull request contains three additional commits since 
> the last revision:
> 
>  - Add JMH and JTReg tests for each optimization pattern and each type
>  - Merge branch 'master' into JDK-8384571-vector-blend-opt-pr1
>  - 8384571: C2: Add some basic IGVN optimization for VectorBlendNode
>    
>    This PR introduces the basic Ideal/Identity transformations for
>    `VectorBlendNode`.
>    
>    The semantic of `VectorBlend(X, Y, M)` is: `M ? Y : X`.
>    
>    **Identity**:
>    ```
>      (VectorBlend X Y (Replicate -1)) => Y
>      (VectorBlend X Y (MaskAll   -1)) => Y
>      (VectorBlend X Y (Replicate  0)) => X
>      (VectorBlend X Y (MaskAll    0)) => X
>    ```
>    
>    **Ideal**:
>    ```
>      (VectorBlend (VectorBlend X A M) B M) => (VectorBlend X B M)
>      (VectorBlend A (VectorBlend B X M) M) => (VectorBlend A X M)
>      (VectorBlend A B (XorV/XorVMask M -1)) => (VectorBlend B A M)
>    ```
>    
>    Also corrects the VectorBlendNode header comment: across all backends
>    (X86 SSE/AVX, AArch64 NEON/SVE, RISC-V V) the active mask lane selects
>    `vec2` (in(2)), and the inactive lane selects `vec1` (in(1)).
>    
>    JTReg and JMH tests are also added for each optimization pattern. All
>    tests (tier1, tier2, and tier3) passed on AArch64 and X86 platforms.
>    
>    JMH benchmark test results:
>    
>    On a Nvidia Grace (Neoverse-V2) machine with 128-bit SVE2:
>    ```
>    Benchmark          Unit    Before  Error   After           Error   Uplift
>    blendNegatedMaskInt        ops/ms  7990.6  2.8     10215.2         11.0    
> 1.3
>    identityAllOnesInt ops/ms  3574.8  2.6     7967.1          0.3     2.2
>    identityAllZerosLong       ops/ms  3575.6  1.0     7966.0          3.6     
> 2.2
>    nestedBlendInnerLong       ops/ms  3533.8  2.8     478573.0        3178.5  
> 135.4
>    nestedBlendOuterInt        ops/ms  3537.6  3.4     472242.2        3034.2  
> 133.5
>    ```
>    
>    On an AWS Graviton3 (Neoverse-V1) machine with 256-bit SVE1:
>    ```
>    Benchmark          Unit    Before  Error   After           Error   Uplift
>    blendNegatedMaskInt        ops/ms  5171.9  5.2     8129.0          17.3    
> 1.6
>    identityAllOnesInt ops/ms  2722.0  0.1     5891.3          0.1     2.2
>    identityAllZerosLong       ops/ms  2722.4  0.1     5891.1          0.3     
> 2.2
>    nestedBlendInnerLong       ops/ms  2697.6  0.0     312148.7        2366.4  
> 115.7
>    nestedBlendOuterInt        ops/ms  2702.7  0.1     308686.0        2709.8  
> 114.2
>    ```
>    
>    On a Nvidia Grace (Neoverse-V2) machine with `-XX:UseSVE=0`:
>    ```
>    Benchmark          Unit    Before  Error   After           Error   Uplift
>    blendNegatedMaskInt        ops/ms  7718.1  1.9     9515.9          54.0    
> 1.2
> ...

A gentle ping on this code review — thanks in advance for taking a look.

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

PR Comment: https://git.openjdk.org/jdk/pull/31333#issuecomment-5175811708

Reply via email to