RFR: 8370863: VectorAPI: Optimize the VectorMaskCast chain in specific patterns [v2]
Eric Fang
erfang at openjdk.org
Thu Dec 11 11:14:25 UTC 2025
On Fri, 28 Nov 2025 09:21:18 GMT, Galder Zamarreño <galder at openjdk.org> wrote:
>> 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:
>>
>> - Don't read and write the same memory in the JMH benchmarks
>> - Merge branch 'master' into JDK-8370863-mask-cast-opt
>> - 8370863: VectorAPI: Optimize the VectorMaskCast chain in specific patterns
>>
>> `VectorMaskCastNode` is used to cast a vector mask from one type to
>> another type. The cast may be generated by calling the vector API `cast`
>> or generated by the compiler. For example, some vector mask operations
>> like `trueCount` require the input mask to be integer types, so for
>> floating point type masks, the compiler will cast the mask to the
>> corresponding integer type mask automatically before doing the mask
>> operation. This kind of cast is very common.
>>
>> If the vector element size is not changed, the `VectorMaskCastNode`
>> don't generate code, otherwise code will be generated to extend or narrow
>> the mask. This IR node is not free no matter it generates code or not
>> because it may block some optimizations. For example:
>> 1. `(VectorStoremask (VectorMaskCast (VectorLoadMask x)))`
>> The middle `VectorMaskCast` prevented the following optimization:
>> `(VectorStoremask (VectorLoadMask x)) => (x)`
>> 2. `(VectorMaskToLong (VectorMaskCast (VectorLongToMask x)))`, which
>> blocks the optimization `(VectorMaskToLong (VectorLongToMask x)) => (x)`.
>>
>> In these IR patterns, the value of the input `x` is not changed, so we
>> can safely do the optimization. But if the input value is changed, we
>> can't eliminate the cast.
>>
>> The general idea of this PR is introducing an `uncast_mask` helper
>> function, which can be used to uncast a chain of `VectorMaskCastNode`,
>> like the existing `Node::uncast(bool)` function. The funtion returns
>> the first non `VectorMaskCastNode`.
>>
>> The intended use case is when the IR pattern to be optimized may
>> contain one or more consecutive `VectorMaskCastNode` and this does not
>> affect the correctness of the optimization. Then this function can be
>> called to eliminate the `VectorMaskCastNode` chain.
>>
>> Current optimizations related to `VectorMaskCastNode` include:
>> 1. `(VectorMaskCast (VectorMaskCast x)) => (x)`, see JDK-8356760.
>> 2. `(XorV (VectorMa...
>
> Nice improvement @erifan, just some small comments from me
Hi @galderz would you mind taking another look of this PR, thanks~
-------------
PR Comment: https://git.openjdk.org/jdk/pull/28313#issuecomment-3641419459
More information about the core-libs-dev
mailing list