Skip to content

Commit f72c73c

Browse files
committed
Use eary exits
1 parent c58cd9c commit f72c73c

File tree

1 file changed

+59
-56
lines changed

1 file changed

+59
-56
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 59 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -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

2479924802
static SDValue

0 commit comments

Comments
 (0)