@@ -10461,6 +10461,7 @@ SDValue RISCVTargetLowering::lowerMaskedStore(SDValue Op,
10461
10461
SDValue BasePtr = MemSD->getBasePtr();
10462
10462
SDValue Val, Mask, VL;
10463
10463
10464
+ bool IsCompressingStore = false;
10464
10465
if (const auto *VPStore = dyn_cast<VPStoreSDNode>(Op)) {
10465
10466
Val = VPStore->getValue();
10466
10467
Mask = VPStore->getMask();
@@ -10469,9 +10470,11 @@ SDValue RISCVTargetLowering::lowerMaskedStore(SDValue Op,
10469
10470
const auto *MStore = cast<MaskedStoreSDNode>(Op);
10470
10471
Val = MStore->getValue();
10471
10472
Mask = MStore->getMask();
10473
+ IsCompressingStore = MStore->isCompressingStore();
10472
10474
}
10473
10475
10474
- bool IsUnmasked = ISD::isConstantSplatVectorAllOnes(Mask.getNode());
10476
+ bool IsUnmasked =
10477
+ ISD::isConstantSplatVectorAllOnes(Mask.getNode()) || IsCompressingStore;
10475
10478
10476
10479
MVT VT = Val.getSimpleValueType();
10477
10480
MVT XLenVT = Subtarget.getXLenVT();
@@ -10481,7 +10484,7 @@ SDValue RISCVTargetLowering::lowerMaskedStore(SDValue Op,
10481
10484
ContainerVT = getContainerForFixedLengthVector(VT);
10482
10485
10483
10486
Val = convertToScalableVector(ContainerVT, Val, DAG, Subtarget);
10484
- if (!IsUnmasked) {
10487
+ if (!IsUnmasked || IsCompressingStore ) {
10485
10488
MVT MaskVT = getMaskTypeFor(ContainerVT);
10486
10489
Mask = convertToScalableVector(MaskVT, Mask, DAG, Subtarget);
10487
10490
}
@@ -10490,6 +10493,15 @@ SDValue RISCVTargetLowering::lowerMaskedStore(SDValue Op,
10490
10493
if (!VL)
10491
10494
VL = getDefaultVLOps(VT, ContainerVT, DL, DAG, Subtarget).second;
10492
10495
10496
+ if (IsCompressingStore) {
10497
+ Val = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, DL, ContainerVT,
10498
+ DAG.getConstant(Intrinsic::riscv_vcompress, DL, XLenVT),
10499
+ DAG.getUNDEF(ContainerVT), Val, Mask, VL);
10500
+ VL =
10501
+ DAG.getNode(RISCVISD::VCPOP_VL, DL, XLenVT, Mask,
10502
+ getAllOnesMask(Mask.getSimpleValueType(), VL, DL, DAG), VL);
10503
+ }
10504
+
10493
10505
unsigned IntID =
10494
10506
IsUnmasked ? Intrinsic::riscv_vse : Intrinsic::riscv_vse_mask;
10495
10507
SmallVector<SDValue, 8> Ops{Chain, DAG.getTargetConstant(IntID, DL, XLenVT)};
0 commit comments