[llvm] [SelectionDAG][RISCV] Use VP_STORE to widen MSTORE in type legalization when possible. (PR #140991)
Pengcheng Wang via llvm-commits
llvm-commits at lists.llvm.org
Thu May 22 01:49:15 PDT 2025
================
@@ -7316,32 +7316,48 @@ SDValue DAGTypeLegalizer::WidenVecOp_MSTORE(SDNode *N, unsigned OpNo) {
SDValue Mask = MST->getMask();
EVT MaskVT = Mask.getValueType();
SDValue StVal = MST->getValue();
+ EVT VT = StVal.getValueType();
SDLoc dl(N);
+ EVT WideVT, WideMaskVT;
if (OpNo == 1) {
// Widen the value.
StVal = GetWidenedVector(StVal);
+ WideVT = StVal.getValueType();
+ WideMaskVT =
+ EVT::getVectorVT(*DAG.getContext(), MaskVT.getVectorElementType(),
+ WideVT.getVectorElementCount());
+ } else {
+ WideMaskVT = TLI.getTypeToTransformTo(*DAG.getContext(), MaskVT);
+
+ EVT ValueVT = StVal.getValueType();
+ WideVT = EVT::getVectorVT(*DAG.getContext(), ValueVT.getVectorElementType(),
+ WideMaskVT.getVectorElementCount());
+ }
+
+ if (TLI.isOperationLegalOrCustom(ISD::VP_STORE, WideVT) &&
+ TLI.isTypeLegal(WideMaskVT)) {
+ Mask = DAG.getInsertSubvector(dl, DAG.getUNDEF(WideMaskVT), Mask, 0);
+ SDValue EVL = DAG.getElementCount(dl, TLI.getVPExplicitVectorLengthTy(),
+ VT.getVectorElementCount());
+ return DAG.getStoreVP(MST->getChain(), dl, StVal, MST->getBasePtr(),
+ MST->getOffset(), Mask, EVL, MST->getMemoryVT(),
+ MST->getMemOperand(), MST->getAddressingMode());
+ }
+
+ if (OpNo == 1) {
// The mask should be widened as well.
- EVT WideVT = StVal.getValueType();
- EVT WideMaskVT = EVT::getVectorVT(*DAG.getContext(),
- MaskVT.getVectorElementType(),
- WideVT.getVectorNumElements());
Mask = ModifyToType(Mask, WideMaskVT, true);
} else {
// Widen the mask.
- EVT WideMaskVT = TLI.getTypeToTransformTo(*DAG.getContext(), MaskVT);
Mask = ModifyToType(Mask, WideMaskVT, true);
- EVT ValueVT = StVal.getValueType();
- EVT WideVT = EVT::getVectorVT(*DAG.getContext(),
- ValueVT.getVectorElementType(),
- WideMaskVT.getVectorNumElements());
StVal = ModifyToType(StVal, WideVT);
}
- assert(Mask.getValueType().getVectorNumElements() ==
- StVal.getValueType().getVectorNumElements() &&
+ assert(Mask.getValueType().getVectorElementCount() ==
+ StVal.getValueType().getVectorElementCount() &&
----------------
wangpc-pp wrote:
Weird indentation here but clang-format doesn't complain?
https://github.com/llvm/llvm-project/pull/140991
More information about the llvm-commits
mailing list