RFR: 8370863: VectorAPI: Optimize the VectorMaskCast chain in specific patterns [v5]

Xiaohong Gong xgong at openjdk.org
Mon Dec 15 03:13:54 UTC 2025


On Mon, 15 Dec 2025 02:36:06 GMT, Eric Fang <erfang at openjdk.org> wrote:

>> src/hotspot/share/opto/vectornode.cpp line 1492:
>> 
>>> 1490:   //   vector[n]{bool} => vector[n]{t} => vector[n]{bool}
>>> 1491:   Node* in1 = VectorNode::uncast_mask(in(1));
>>> 1492:   if (in1->Opcode() == Op_VectorLoadMask && length() == in1->as_Vector()->length()) {
>> 
>> Can there be a mismatch with the length? Can you give me an example?
>
> There are currently no such counterexamples. Because now we require the length of `VectorMaskCastNode` to be consistent with the length of its input node. But I'm not sure whether this restriction will be lifted in the future, and this optimization requires the length to be the same. Because of this requirement, I added this check. Similarly, in `uncast_mask` I also did the following assert:
> `assert(n->as_Vector()->length() == in1->as_Vector()->length(), "vector length must match");`
> 
> Do you think it would be better to change this condition to an assert?

Yeah, currently we might not have such a real case that the length is not matched, regardless whether there is mask casts inside the chain. At least I cannot find such a case in API level.  Not sure whether such pattern will be generated by compiler itself in future due to some optimizations.

As an optimization of `VectorStoreMask (VectorLoadMask vect) => vec`, we must make sure that the vector type before and after are exactly matched with each other. Consider both the basic element type of `VectorStoreMask` and the input of `VectorLoadMask` (i.e. the `vect`) are `boolean`, just checking the vector length is enough.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/28313#discussion_r2617810466


More information about the hotspot-compiler-dev mailing list