[vectorIntrinsics] RFR: 8266720: Wrong implementation in LibraryCallKit::inline_vector_shuffle_iota

Wang Huang whuang at openjdk.java.net
Fri May 14 01:41:06 UTC 2021


On Thu, 13 May 2021 17:57:20 GMT, Sandhya Viswanathan <sviswanathan at openjdk.org> wrote:

>> Because JDK-8266317 has not been merged into jdk/jdk. So I fix this bug here.
>> * This comparsion should be a unsigned cmp
>> *  `x86` is not wrong because `x86` does not have 1024-bits vl here. 
>>   ```c++
>> 
>>     ConINode* pred_node = (ConINode*)gvn().makecon(TypeInt::make(BoolTest::ge)); // should BoolTest::ugt
>>     Node * lane_cnt  = gvn().makecon(TypeInt::make(num_elem));
>>     Node * bcast_lane_cnt = gvn().transform(VectorNode::scalar2vector(lane_cnt, num_elem, type_bt));
>>     // should BoolTest::ugt
>>     Node* mask = gvn().transform(new VectorMaskCmpNode(BoolTest::ge, bcast_lane_cnt, res, pred_node, vt));
>
> src/hotspot/share/opto/vectorIntrinsics.cpp line 456:
> 
>> 454:     res = gvn().transform(VectorNode::make(Op_AndI, res, bcast_mod, num_elem, elem_bt));
>> 455:   } else {
>> 456:     ConINode* pred_node = (ConINode*)gvn().makecon(TypeInt::make(BoolTest::ugt));
> 
> Unsigned comparison adds overhead and is not supported on all architectures.

After changing notes with @XiaohongGong , I think we can also fix like this: 

    ConINode* pred_node = (ConINode*)gvn().makecon(TypeInt::make(BoolTest::ge));
    Node * lane_cnt_tmp  = gvn().makecon(TypeInt::make(num_elem - 1));
    Node * bcast_lane_cnt = gvn().transform(VectorNode::scalar2vector(lane_cnt_tmp, num_elem, type_bt));
    Node* mask = gvn().transform(new VectorMaskCmpNode(BoolTest::ge, bcast_lane_cnt, res, pred_node, vt));

    // Make the indices greater than lane count as -ve values. This matches the java side implementation.
    res = gvn().transform(VectorNode::make(Op_AndI, res, bcast_mod, num_elem, elem_bt));
    Node * lane_cnt  = gvn().makecon(TypeInt::make(num_elem)); // Add a mov & bcast here
    Node * bcast_lane_cnt = gvn().transform(VectorNode::scalar2vector(lane_cnt, num_elem, type_bt));
    Node * biased_val = gvn().transform(VectorNode::make(Op_SubI, res, bcast_lane_cnt, num_elem, elem_bt));
    res = gvn().transform(new VectorBlendNode(biased_val, res, mask));

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

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


More information about the panama-dev mailing list