@@ -24736,64 +24736,67 @@ static SDValue performZIP1Combine(SDNode *N, SelectionDAG &DAG) {
2473624736 SDLoc DL(N);
2473724737 EVT VT = N->getValueType(0);
2473824738 EVT EltVT = VT.getVectorElementType();
24739+
2473924740 SDValue Op0 = skipElementSizePreservingCast(N->getOperand(0), VT);
2474024741 SDValue Op1 = skipElementSizePreservingCast(N->getOperand(1), VT);
24741- if (Op0 && Op1 && Op0->getOpcode() == ISD::INSERT_VECTOR_ELT &&
24742- Op1->getOpcode() == ISD::INSERT_VECTOR_ELT) {
24743- SDValue Op00 = Op0->getOperand(0);
24744- SDValue Op10 = Op1->getOperand(0);
24745- if (Op00.isUndef() && Op10.isUndef() &&
24746- Op0->getConstantOperandVal(2) == 0 &&
24747- Op1->getConstantOperandVal(2) == 0) {
24748- SDValue Op01 = Op0->getOperand(1);
24749- SDValue Op11 = Op1->getOperand(1);
24750- if (Op01->getOpcode() == ISD::EXTRACT_VECTOR_ELT &&
24751- Op11->getOpcode() == ISD::EXTRACT_VECTOR_ELT) {
24752- SDValue Op010 = skipElementSizePreservingCast(Op01->getOperand(0), VT);
24753- SDValue Op110 = skipElementSizePreservingCast(Op11->getOperand(0), VT);
24754- unsigned StartExtractIdx = Op01->getConstantOperandVal(1);
24755- if (Op010 && Op010 == Op110 &&
24756- Op11->getConstantOperandVal(1) == StartExtractIdx + 1 &&
24757- StartExtractIdx % 2 == 0) {
24758- // t0: nxv16i8 = ...
24759- // t1: i32 = extract_vector_elt t0, Constant:i64<n>
24760- // t2: i32 = extract_vector_elt t0, Constant:i64<n + 1>
24761- // t3: nxv16i8 = insert_vector_elt(undef, t1, 0)
24762- // t4: nxv16i8 = insert_vector_elt(undef, t2, 0)
24763- // t5: nxv16i8 = zip1(t3, t4)
24764- //
24765- // ->
24766- // t0: nxv16i8 = ...
24767- // t1: nxv8i16 = bitcast t0
24768- // t2: i32 = extract_vector_elt t1, Constant:i64<n / 2>
24769- // t3: nxv8i16 = insert_vector_elt(undef, t2, 0)
24770- // t4: nxv16i8 = bitcast t3
24771- //
24772- // Where n % 2 == 0
24773- SDValue Result;
24774- if (StartExtractIdx == 0)
24775- Result = Op010;
24776- else if (EltVT.getSizeInBits() < 64) {
24777- unsigned LargeEltBits = EltVT.getSizeInBits() * 2;
24778- EVT LargeEltVT = MVT::getVectorVT(
24779- MVT::getIntegerVT(LargeEltBits),
24780- VT.getVectorElementCount().divideCoefficientBy(2));
24781- EVT ExtractVT = MVT::getIntegerVT(std::max(LargeEltBits, 32U));
24782- SDValue Extract =
24783- DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, ExtractVT,
24784- DAG.getBitcast(LargeEltVT, Op010),
24785- DAG.getVectorIdxConstant(StartExtractIdx / 2, DL));
24786- Result = DAG.getNode(ISD::INSERT_VECTOR_ELT, DL, LargeEltVT,
24787- DAG.getUNDEF(LargeEltVT), Extract,
24788- DAG.getVectorIdxConstant(0, DL));
24789- }
24790- if (Result)
24791- return DAG.getBitcast(VT, Result);
24792- }
24793- }
24794- }
24795- }
24796- return SDValue();
24742+ if (!Op0 || !Op1 || Op0->getOpcode() != ISD::INSERT_VECTOR_ELT ||
24743+ Op1->getOpcode() != ISD::INSERT_VECTOR_ELT)
24744+ return SDValue();
24745+
24746+ SDValue Op00 = Op0->getOperand(0);
24747+ SDValue Op10 = Op1->getOperand(0);
24748+ if (!Op00.isUndef() || !Op10.isUndef() ||
24749+ Op0->getConstantOperandVal(2) != 0 || Op1->getConstantOperandVal(2) != 0)
24750+ return SDValue();
24751+
24752+ SDValue Op01 = Op0->getOperand(1);
24753+ SDValue Op11 = Op1->getOperand(1);
24754+ if (Op01->getOpcode() != ISD::EXTRACT_VECTOR_ELT ||
24755+ Op11->getOpcode() != ISD::EXTRACT_VECTOR_ELT)
24756+ return SDValue();
24757+
24758+ SDValue Op010 = skipElementSizePreservingCast(Op01->getOperand(0), VT);
24759+ SDValue Op110 = skipElementSizePreservingCast(Op11->getOperand(0), VT);
24760+ unsigned StartExtractIdx = Op01->getConstantOperandVal(1);
24761+ if (!Op010 || Op010 != Op110 ||
24762+ Op11->getConstantOperandVal(1) != StartExtractIdx + 1 ||
24763+ StartExtractIdx % 2 != 0)
24764+ return SDValue();
24765+
24766+ // t0: nxv16i8 = ...
24767+ // t1: i32 = extract_vector_elt t0, Constant:i64<n>
24768+ // t2: i32 = extract_vector_elt t0, Constant:i64<n + 1>
24769+ // t3: nxv16i8 = insert_vector_elt(undef, t1, 0)
24770+ // t4: nxv16i8 = insert_vector_elt(undef, t2, 0)
24771+ // t5: nxv16i8 = zip1(t3, t4)
24772+ //
24773+ // ->
24774+ // t0: nxv16i8 = ...
24775+ // t1: nxv8i16 = bitcast t0
24776+ // t2: i32 = extract_vector_elt t1, Constant:i64<n / 2>
24777+ // t3: nxv8i16 = insert_vector_elt(undef, t2, 0)
24778+ // t4: nxv16i8 = bitcast t3
24779+ //
24780+ // Where n % 2 == 0
24781+ SDValue Result;
24782+ if (StartExtractIdx == 0)
24783+ Result = Op010;
24784+ else if (EltVT.getSizeInBits() < 64) {
24785+ unsigned LargeEltBits = EltVT.getSizeInBits() * 2;
24786+ EVT LargeEltVT =
24787+ MVT::getVectorVT(MVT::getIntegerVT(LargeEltBits),
24788+ VT.getVectorElementCount().divideCoefficientBy(2));
24789+ EVT ExtractVT = MVT::getIntegerVT(std::max(LargeEltBits, 32U));
24790+ SDValue Extract =
24791+ DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, ExtractVT,
24792+ DAG.getBitcast(LargeEltVT, Op010),
24793+ DAG.getVectorIdxConstant(StartExtractIdx / 2, DL));
24794+ Result = DAG.getNode(ISD::INSERT_VECTOR_ELT, DL, LargeEltVT,
24795+ DAG.getUNDEF(LargeEltVT), Extract,
24796+ DAG.getVectorIdxConstant(0, DL));
24797+ }
24798+
24799+ return Result ? DAG.getBitcast(VT, Result) : SDValue();
2479724800}
2479824801
2479924802static SDValue
0 commit comments