RFR: 8356760: VectorAPI: Optimize VectorMask.fromLong for all-true/all-false cases

Xiaohong Gong xgong at openjdk.org
Fri Jun 27 01:43:47 UTC 2025


On Fri, 13 Jun 2025 08:33:09 GMT, erifan <duke at openjdk.org> wrote:

> If the input long value `l` of `VectorMask.fromLong(SPECIES, l)` would set or unset all lanes, `VectorMask.fromLong(SPECIES, l)` is equivalent to `maskAll(true)` or `maskAll(false)`. But the cost of `maskAll` is relative smaller than that of `fromLong`. This patch does the conversion for these cases if `l` is a compile time constant.
> 
> And this conversion also enables further optimizations that recognize maskAll patterns, see [1].
> 
> Some JTReg test cases are added to ensure the optimization is effective.
> 
> I tried many different ways to write a JMH benchmark, but failed. Since the input of `VectorMask.fromLong(SPECIES, l)` needs to be a specific compile-time constant, the statement will be hoisted out of the loop. If we don't use a loop, the hotspot will become other instructions, and no obvious performance change was observed. However, combined with the optimization of [1], we can observe a performance improvement of about 7% on both aarch64 and x64.
> 
> The patch was tested on both aarch64 and x64, all of tier1 tier2 and tier3 tests passed.
> 
> [1] https://github.com/openjdk/jdk/pull/24674

src/hotspot/share/opto/vectorIntrinsics.cpp line 80:

> 78:     return false;
> 79:   }
> 80:   long mask = (0xFFFFFFFFFFFFFFFFULL >> (64 - vlen));

The higher bits of long input should be cleared. So we should generate an unsigned right shift instead of the signed one?

src/hotspot/share/opto/vectorIntrinsics.cpp line 706:

> 704:         opc = Op_Replicate;
> 705:         elem_bt = converted_elem_bt;
> 706:         bits = gvn().longcon(bits_type->get_con() == 0L ? 0L : -1L);

The `maskAll(false)` will be generated only if the input bits is `0L`. So if `bits = 0xffff0000`, and the `vlen = 4`, what is the expected mask? Is it expected to all false or all true? From the API design, I guess it is all false. But from the code above, it will be all true, right? Could you please double check and add a test for that?

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

PR Review Comment: https://git.openjdk.org/jdk/pull/25793#discussion_r2170481682
PR Review Comment: https://git.openjdk.org/jdk/pull/25793#discussion_r2170486973


More information about the hotspot-compiler-dev mailing list