@@ -20831,42 +20831,50 @@ SDValue RISCVTargetLowering::PerformDAGCombine(SDNode *N,
2083120831
2083220832 unsigned NF = 0;
2083320833 switch (Tuple.getConstantOperandVal(1)) {
20834- default: break;
20835- case Intrinsic::riscv_vlseg2_mask: NF = 2; break;
20836- case Intrinsic::riscv_vlseg3_mask: NF = 3; break;
20837- case Intrinsic::riscv_vlseg4_mask: NF = 4; break;
20838- case Intrinsic::riscv_vlseg5_mask: NF = 5; break;
20839- case Intrinsic::riscv_vlseg6_mask: NF = 6; break;
20840- case Intrinsic::riscv_vlseg7_mask: NF = 7; break;
20841- case Intrinsic::riscv_vlseg8_mask: NF = 8; break;
20834+ default:
20835+ break;
20836+ case Intrinsic::riscv_vlseg2_mask:
20837+ case Intrinsic::riscv_vlseg3_mask:
20838+ case Intrinsic::riscv_vlseg4_mask:
20839+ case Intrinsic::riscv_vlseg5_mask:
20840+ case Intrinsic::riscv_vlseg6_mask:
20841+ case Intrinsic::riscv_vlseg7_mask:
20842+ case Intrinsic::riscv_vlseg8_mask:
20843+ NF = Tuple.getValueType().getRISCVVectorTupleNumFields();
20844+ break;
2084220845 }
20846+
2084320847 if (!NF || Subtarget.hasOptimizedSegmentLoadStore(NF))
2084420848 break;
2084520849
20846- // @REVIEWERS - What's the right value to use for the mem size here?
2084720850 unsigned SEW = VT.getScalarSizeInBits();
2084820851 if (Log2_64(SEW) != Tuple.getConstantOperandVal(7))
2084920852 break;
20850- unsigned Stride = SEW/ 8 * NF;
20851- SDValue Offset = DAG.getConstant( SEW/ 8 * Idx, DL, XLenVT) ;
20853+ unsigned Stride = SEW / 8 * NF;
20854+ unsigned Offset = SEW / 8 * Idx;
2085220855
2085320856 SDValue Ops[] = {
20854- /*Chain=*/Tuple.getOperand(0),
20855- /*IntID=*/DAG.getTargetConstant(Intrinsic::riscv_vlse_mask, DL, XLenVT),
20856- /*Passthru=*/Tuple.getOperand(2),
20857- /*Ptr=*/DAG.getNode(ISD::ADD, DL, XLenVT, Tuple.getOperand(3), Offset),
20858- /*Stride=*/DAG.getConstant(Stride, DL, XLenVT),
20859- /*Mask=*/Tuple.getOperand(4),
20860- /*VL=*/Tuple.getOperand(5),
20861- /*Policy=*/Tuple.getOperand(6)
20862- };
20857+ /*Chain=*/Tuple.getOperand(0),
20858+ /*IntID=*/DAG.getTargetConstant(Intrinsic::riscv_vlse_mask, DL, XLenVT),
20859+ /*Passthru=*/Tuple.getOperand(2),
20860+ /*Ptr=*/
20861+ DAG.getNode(ISD::ADD, DL, XLenVT, Tuple.getOperand(3),
20862+ DAG.getConstant(Offset, DL, XLenVT)),
20863+ /*Stride=*/DAG.getConstant(Stride, DL, XLenVT),
20864+ /*Mask=*/Tuple.getOperand(4),
20865+ /*VL=*/Tuple.getOperand(5),
20866+ /*Policy=*/Tuple.getOperand(6)};
20867+
20868+ auto TupleMemSD = cast<MemIntrinsicSDNode>(Tuple);
20869+ // Match getTgtMemIntrinsic for non-unit stride case
20870+ EVT MemVT = TupleMemSD->getMemoryVT().getScalarType();
20871+ MachineFunction &MF = DAG.getMachineFunction();
20872+ MachineMemOperand *MMO = MF.getMachineMemOperand(
20873+ TupleMemSD->getMemOperand(), Offset, MemoryLocation::UnknownSize);
2086320874
2086420875 SDVTList VTs = DAG.getVTList({VT, MVT::Other});
20865- // @REVIEWERS - What's the right MemVT and MMO to use here?
20866- SDValue Result =
20867- DAG.getMemIntrinsicNode(ISD::INTRINSIC_W_CHAIN, DL, VTs, Ops,
20868- cast<MemIntrinsicSDNode>(Tuple)->getMemoryVT(),
20869- cast<MemIntrinsicSDNode>(Tuple)->getMemOperand());
20876+ SDValue Result = DAG.getMemIntrinsicNode(ISD::INTRINSIC_W_CHAIN, DL, VTs,
20877+ Ops, MemVT, MMO);
2087020878 DAG.ReplaceAllUsesOfValueWith(Tuple.getValue(1), Result.getValue(1));
2087120879 return Result.getValue(0);
2087220880 }
0 commit comments