On Thu, 29 Oct 2026 05:03:50 GMT, Quan Anh Mai <[email protected]> wrote:

>> Hi @merykitty, I'd like to discuss this a bit further.
>> 
>> Another reason for having Vector and VectorMask share an implementation was 
>> that some VectorMask nodes, such as `XorVMaskNode`, `OrVMaskNode`, and 
>> `AndVMaskNode`, inherit from their corresponding vector nodes (`XorVNode`, 
>> `OrVNode`, and `AndVNode`). From the node inheritance perspective, a vector 
>> mask is therefore also a Vector. On platforms such as NEON and AVX2, which 
>> do not have `pVectMask`, vector masks are effectively represented as 
>> vectors. So the type distinction between vectors and vector masks is not 
>> entirely clear-cut, perhaps partly because of how C2 defines these nodes. 
>> I'm not opposed to separating them; just wanted to clarify a bit more on the 
>> original approach.
>> 
>> Also, around line 53 of this file, we define a fixed set of interfaces. The 
>> original intention was to require all `NodeTypeCon` types to implement these 
>> interfaces for consistency. However, vectors and vector masks support quite 
>> different sets of operations, and some optimizations may not be shareable 
>> across all types. Given that, it seems reasonable not to require every type 
>> to implement the same set of interfaces. So, should we require all types to 
>> implement a fixed set of interfaces? I'd be interested to hear your thoughts 
>> on this.
>> 
>> Thanks~
>
> @erifan I think there are some misconception here:
> 
>> some `VectorMask` nodes, such as `XorVMaskNode`, `OrVMaskNode`, and 
>> `AndVMaskNode`, inherit from their corresponding vector nodes (`XorVNode`, 
>> `OrVNode`, and `AndVNode`).
> 
> Similar to other node inheritance in C2 (such as `OrINode` inherits `AddNode` 
> for some reasons), I think this is bad design, no inheritence guideline would 
> guide you towards a `XorVMaskNode` being a `XorVNode`. As a result, we should 
> not rely on such design for the design of this optimization.
> 
>> On platforms such as NEON and AVX2, which do not have `pVectMask`, vector 
>> masks are effectively represented as vectors.
> 
> You are confused a `j.i.v.VectorMask` with a `PVectMask`. A 
> `j.i.v.VectorMask` is an abstract concept provided by the Vector API, it is 
> either mapped to a `PVectMask` on architectures that support it, or a `Vect` 
> otherwise. On the other hand, a `PVectMask` is a value that is represented by 
> by a predicate register, and is entirely different from a `Vect`.
> 
>> Also, around line 53 of this file, we define a fixed set of interfaces. The 
>> original intention was to require all `NodeTypeCon` types to implement these 
>> interfaces for consistency. However, vectors and vector masks support quite 
>> different sets of operations,
> 
> That actually further adds reasons why we should have different `NodeTypeCon` 
> for `Vect` and `PVectMask`. Since if you incorrectly call an optimization 
> that is not available on `PVectMask`, the code will not compile. You don't 
> need to implement all these interfaces, it should only implement the 
> necessary one. For example, since `PVectMask` does not support addition, if 
> you try to call `GenericOpts::Ideal_Add<VECTOR_MASK>`, the template 
> instantiation will fail.

Thank you for the clarification. I think I know how to proceed now.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/32095#discussion_r4409308269

Reply via email to