[llvm] r319849 - [SelectionDAG] Don't call GetWidenedVector for mask operands of MLOAD/MSTORE.

Craig Topper via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 5 15:08:25 PST 2017


Author: ctopper
Date: Tue Dec  5 15:08:25 2017
New Revision: 319849

URL: http://llvm.org/viewvc/llvm-project?rev=319849&view=rev
Log:
[SelectionDAG] Don't call GetWidenedVector for mask operands of MLOAD/MSTORE.

GetWidenedVector does't guarantee the widened elements are zero which would break the intended behavior of the operation.

Modified:
    llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp

Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp?rev=319849&r1=319848&r2=319849&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp Tue Dec  5 15:08:25 2017
@@ -2911,16 +2911,12 @@ SDValue DAGTypeLegalizer::WidenVecRes_ML
 
   EVT WidenVT = TLI.getTypeToTransformTo(*DAG.getContext(),N->getValueType(0));
   SDValue Mask = N->getMask();
-  EVT MaskVT = Mask.getValueType();
   SDValue Src0 = GetWidenedVector(N->getSrc0());
   ISD::LoadExtType ExtType = N->getExtensionType();
   SDLoc dl(N);
 
-  if (getTypeAction(MaskVT) == TargetLowering::TypeWidenVector)
-    Mask = GetWidenedVector(Mask);
-  else {
-    Mask = WidenTargetBoolean(Mask, WidenVT, true);
-  }
+  // The mask should be widened as well
+  Mask = WidenTargetBoolean(Mask, WidenVT, true);
 
   SDValue Res = DAG.getMaskedLoad(WidenVT, dl, N->getChain(), N->getBasePtr(),
                                   Mask, Src0, N->getMemoryVT(),
@@ -3532,20 +3528,17 @@ SDValue DAGTypeLegalizer::WidenVecOp_STO
 }
 
 SDValue DAGTypeLegalizer::WidenVecOp_MSTORE(SDNode *N, unsigned OpNo) {
+  assert(OpNo == 3 && "Can widen only data operand of mstore");
   MaskedStoreSDNode *MST = cast<MaskedStoreSDNode>(N);
   SDValue Mask = MST->getMask();
-  EVT MaskVT = Mask.getValueType();
   SDValue StVal = MST->getValue();
   // Widen the value
   SDValue WideVal = GetWidenedVector(StVal);
   SDLoc dl(N);
 
-  if (OpNo == 2 || getTypeAction(MaskVT) == TargetLowering::TypeWidenVector)
-    Mask = GetWidenedVector(Mask);
-  else {
-    // The mask should be widened as well.
-    Mask = WidenTargetBoolean(Mask, WideVal.getValueType(), true);
-  }
+  // The mask should be widened as well.
+  Mask = WidenTargetBoolean(Mask, WideVal.getValueType(), true);
+
   assert(Mask.getValueType().getVectorNumElements() ==
          WideVal.getValueType().getVectorNumElements() &&
          "Mask and data vectors should have the same number of elements");




More information about the llvm-commits mailing list