@@ -24736,67 +24736,64 @@ static SDValue performZIP1Combine(SDNode *N, SelectionDAG &DAG) {
2473624736 SDLoc DL(N);
2473724737 EVT VT = N->getValueType(0);
2473824738 EVT EltVT = VT.getVectorElementType();
24739-
2474024739 SDValue Op0 = skipElementSizePreservingCast(N->getOperand(0), VT);
2474124740 SDValue Op1 = skipElementSizePreservingCast(N->getOperand(1), VT);
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();
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();
2480024797}
2480124798
2480224799static SDValue
0 commit comments