[vectorIntrinsics+mask] RFR: 8266287: Basic mask IR implementation for the Vector API masking feature support

Xiaohong Gong xgong at openjdk.java.net
Thu May 13 01:58:22 UTC 2021

On Wed, 12 May 2021 10:27:11 GMT, Jatin Bhateja <jbhateja at openjdk.org> wrote:

>> Based on [1], this patch adds the C2 compiler mid-end changes for the masking feature support. It mainly contains:
>>  1) Generation of the mask IRs for vector mask, including:
>>     - Mask generations, e.g. load/compare/maskAll
>>     - Mask operations, e.g. and/or/xor
>>  2) Conversions between vector and mask after loading mask values from memory and before storing mask values into memory
>>  3) Generation of the vector IRs which need the mask value as the control
>>     - The mask value is appended to the original vector node's input list
>> With this change, the bottom type of the vector mask will be set to `"TypeVectMask"` if the platform supports the masking feature and the backend implementations are added.
>> Note that this patch only contains the compiler mid-end changes. The backend implementations for SVE/AVX-512 will be in the
>> followed-up patches.
>> [1] https://github.com/openjdk/panama-vector/pull/57
> src/hotspot/share/adlc/formssel.cpp line 3888:
>> 3886:   if (_rChild)
>> 3887:     _rChild->count_commutative_op(count);
>> 3888: }
> Matcher rules based on proposed masked IR shall look like following
>    match(Set dst  AddVI (Binary vsrc1 vsrc2)  mask)
> AddVI is still commutative and generated DFA will check for appropriate child states i.e.
>     kid[0]->state == _Binary_vec_vec  &&  kid[1]->state == _mask
> So even if matcher generates additional check by swapping the states of the two child nodes it should still be ok. Can you kindly elaborate the need for this change.

Yes, actually that's ok if matcher swaps the two operands. Avoiding the swapping could avoid generating unneeded rules which could reduce the whole code size.

> src/hotspot/share/opto/classes.hpp line 475:
>> 473: macro(AndVMask)
>> 474: macro(OrVMask)
>> 475: macro(XorVMask)
> Since you have used existing IR nodes for other commutative vector operations like Add/Sub/Mul, why specialized masked IR for OrV/AndV/XorV

These three nodes are used for the vector mask logical operations while not for the masked vector logics. E.g `mask.and()/mask.or()/mask.xor()`.


PR: https://git.openjdk.java.net/panama-vector/pull/78

More information about the panama-dev mailing list