@@ -21160,26 +21160,28 @@ SDValue RISCVTargetLowering::PerformDAGCombine(SDNode *N,
2116021160 // If the scalar we're sliding in was extracted from the first element of a
2116121161 // vector, we can use that vector as the passthru in a normal slideup of 1.
2116221162 // This saves us an extract_element instruction (i.e. vfmv.f.s, vmv.x.s).
21163- if (N->getOperand(0).isUndef() &&
21164- sd_match(N->getOperand(2),
21165- m_AnyOf(m_ExtractElt(m_Value(SrcVec), m_Zero()),
21166- m_Node(RISCVISD::VMV_X_S, m_Value(SrcVec))))) {
21167- MVT SrcVecVT = SrcVec.getSimpleValueType();
21168- // Adapt the value type of source vector.
21169- if (SrcVecVT.isFixedLengthVector()) {
21170- SrcVecVT = getContainerForFixedLengthVector(SrcVecVT);
21171- SrcVec = convertToScalableVector(SrcVecVT, SrcVec, DAG, Subtarget);
21172- }
21173- if (SrcVecVT.getVectorMinNumElements() < VT.getVectorMinNumElements())
21174- SrcVec = DAG.getInsertSubvector(DL, DAG.getUNDEF(VT), SrcVec, 0);
21175- else
21176- SrcVec = DAG.getExtractSubvector(DL, VT, SrcVec, 0);
21163+ if (!N->getOperand(0).isUndef() ||
21164+ !sd_match(N->getOperand(2),
21165+ m_AnyOf(m_ExtractElt(m_Value(SrcVec), m_Zero()),
21166+ m_Node(RISCVISD::VMV_X_S, m_Value(SrcVec)))))
21167+ break;
2117721168
21178- return getVSlideup(DAG, Subtarget, DL, VT, SrcVec, N->getOperand(1),
21179- DAG.getConstant(1, DL, XLenVT), N->getOperand(3),
21180- N->getOperand(4));
21169+ MVT SrcVecVT = SrcVec.getSimpleValueType();
21170+ if (SrcVecVT.getVectorElementType() != VT.getVectorElementType())
21171+ break;
21172+ // Adapt the value type of source vector.
21173+ if (SrcVecVT.isFixedLengthVector()) {
21174+ SrcVecVT = getContainerForFixedLengthVector(SrcVecVT);
21175+ SrcVec = convertToScalableVector(SrcVecVT, SrcVec, DAG, Subtarget);
2118121176 }
21182- break;
21177+ if (SrcVecVT.getVectorMinNumElements() < VT.getVectorMinNumElements())
21178+ SrcVec = DAG.getInsertSubvector(DL, DAG.getUNDEF(VT), SrcVec, 0);
21179+ else
21180+ SrcVec = DAG.getExtractSubvector(DL, VT, SrcVec, 0);
21181+
21182+ return getVSlideup(DAG, Subtarget, DL, VT, SrcVec, N->getOperand(1),
21183+ DAG.getConstant(1, DL, XLenVT), N->getOperand(3),
21184+ N->getOperand(4));
2118321185 }
2118421186 }
2118521187
0 commit comments