diff options
| author | Craig Topper <craig.topper@intel.com> | 2017-12-05 23:08:25 +0000 |
|---|---|---|
| committer | Craig Topper <craig.topper@intel.com> | 2017-12-05 23:08:25 +0000 |
| commit | 57440a6f65f033368b9c01d074ed7af1d6aa18bf (patch) | |
| tree | 9333e5882425b3a6f4f28d81829daa0777a989bc | |
| parent | ba3542b2214664b2b795f2748a44b2f1917dc372 (diff) | |
| download | bcm5719-llvm-57440a6f65f033368b9c01d074ed7af1d6aa18bf.tar.gz bcm5719-llvm-57440a6f65f033368b9c01d074ed7af1d6aa18bf.zip | |
[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.
llvm-svn: 319849
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp | 19 |
1 files changed, 6 insertions, 13 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp index b7159aada30..1aa2914c54e 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp @@ -2911,16 +2911,12 @@ SDValue DAGTypeLegalizer::WidenVecRes_MLOAD(MaskedLoadSDNode *N) { 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_STORE(SDNode *N) { } 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"); |

