Skip to content

Commit db06ebb

Browse files
authored
[AArch64][NFC] Add isTRNMask improvements to isZIPMask (#171532)
Some [ideas for improvement](#169858 (review)) came up during review of recent changes to `isTRNMask`. This PR applies them also to `isZIPMask`, which is implemented almost identically.
1 parent 2c1decb commit db06ebb

File tree

2 files changed

+30
-29
lines changed

2 files changed

+30
-29
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31797,12 +31797,12 @@ SDValue AArch64TargetLowering::LowerFixedLengthVECTOR_SHUFFLEToSVE(
3179731797
unsigned OperandOrder;
3179831798
if (isZIPMask(ShuffleMask, VT.getVectorNumElements(), WhichResult,
3179931799
OperandOrder) &&
31800-
WhichResult == 0)
31801-
return convertFromScalableVector(
31802-
DAG, VT,
31803-
DAG.getNode(AArch64ISD::ZIP1, DL, ContainerVT,
31804-
OperandOrder == 0 ? Op1 : Op2,
31805-
OperandOrder == 0 ? Op2 : Op1));
31800+
WhichResult == 0) {
31801+
SDValue ZIP = DAG.getNode(AArch64ISD::ZIP1, DL, ContainerVT,
31802+
OperandOrder == 0 ? Op1 : Op2,
31803+
OperandOrder == 0 ? Op2 : Op1);
31804+
return convertFromScalableVector(DAG, VT, ZIP);
31805+
}
3180631806

3180731807
if (isTRNMask(ShuffleMask, VT.getVectorNumElements(), WhichResult,
3180831808
OperandOrder)) {
@@ -31852,12 +31852,12 @@ SDValue AArch64TargetLowering::LowerFixedLengthVECTOR_SHUFFLEToSVE(
3185231852

3185331853
if (isZIPMask(ShuffleMask, VT.getVectorNumElements(), WhichResult,
3185431854
OperandOrder) &&
31855-
WhichResult != 0)
31856-
return convertFromScalableVector(
31857-
DAG, VT,
31858-
DAG.getNode(AArch64ISD::ZIP2, DL, ContainerVT,
31859-
OperandOrder == 0 ? Op1 : Op2,
31860-
OperandOrder == 0 ? Op2 : Op1));
31855+
WhichResult != 0) {
31856+
SDValue ZIP = DAG.getNode(AArch64ISD::ZIP2, DL, ContainerVT,
31857+
OperandOrder == 0 ? Op1 : Op2,
31858+
OperandOrder == 0 ? Op2 : Op1);
31859+
return convertFromScalableVector(DAG, VT, ZIP);
31860+
}
3186131861

3186231862
if (isUZPMask(ShuffleMask, VT.getVectorNumElements(), WhichResult)) {
3186331863
unsigned Opc = (WhichResult == 0) ? AArch64ISD::UZP1 : AArch64ISD::UZP2;

llvm/lib/Target/AArch64/AArch64PerfectShuffle.h

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6631,43 +6631,44 @@ inline bool isZIPMask(ArrayRef<int> M, unsigned NumElts,
66316631
if (NumElts % 2 != 0)
66326632
return false;
66336633

6634-
// "Variant" refers to the distinction bwetween zip1 and zip2, while
6635-
// "Order" refers to sequence of input registers (matching vs flipped).
6636-
bool Variant0Order0 = true; // WhichResultOut = 0, OperandOrderOut = 0
6637-
bool Variant1Order0 = true; // WhichResultOut = 1, OperandOrderOut = 0
6638-
bool Variant0Order1 = true; // WhichResultOut = 0, OperandOrderOut = 1
6639-
bool Variant1Order1 = true; // WhichResultOut = 1, OperandOrderOut = 1
6634+
// "Result" corresponds to "WhichResultOut", selecting between zip1 and zip2.
6635+
// "Order" corresponds to "OperandOrderOut", selecting the order of operands
6636+
// for the instruction (flipped or not).
6637+
bool Result0Order0 = true; // WhichResultOut = 0, OperandOrderOut = 0
6638+
bool Result1Order0 = true; // WhichResultOut = 1, OperandOrderOut = 0
6639+
bool Result0Order1 = true; // WhichResultOut = 0, OperandOrderOut = 1
6640+
bool Result1Order1 = true; // WhichResultOut = 1, OperandOrderOut = 1
66406641
// Check all elements match.
66416642
for (unsigned i = 0; i != NumElts; i += 2) {
66426643
if (M[i] >= 0) {
66436644
unsigned EvenElt = (unsigned)M[i];
66446645
if (EvenElt != i / 2)
6645-
Variant0Order0 = false;
6646+
Result0Order0 = false;
66466647
if (EvenElt != NumElts / 2 + i / 2)
6647-
Variant1Order0 = false;
6648+
Result1Order0 = false;
66486649
if (EvenElt != NumElts + i / 2)
6649-
Variant0Order1 = false;
6650+
Result0Order1 = false;
66506651
if (EvenElt != NumElts + NumElts / 2 + i / 2)
6651-
Variant1Order1 = false;
6652+
Result1Order1 = false;
66526653
}
66536654
if (M[i + 1] >= 0) {
66546655
unsigned OddElt = (unsigned)M[i + 1];
66556656
if (OddElt != NumElts + i / 2)
6656-
Variant0Order0 = false;
6657+
Result0Order0 = false;
66576658
if (OddElt != NumElts + NumElts / 2 + i / 2)
6658-
Variant1Order0 = false;
6659+
Result1Order0 = false;
66596660
if (OddElt != i / 2)
6660-
Variant0Order1 = false;
6661+
Result0Order1 = false;
66616662
if (OddElt != NumElts / 2 + i / 2)
6662-
Variant1Order1 = false;
6663+
Result1Order1 = false;
66636664
}
66646665
}
66656666

6666-
if (Variant0Order0 + Variant1Order0 + Variant0Order1 + Variant1Order1 != 1)
6667+
if (Result0Order0 + Result1Order0 + Result0Order1 + Result1Order1 != 1)
66676668
return false;
66686669

6669-
WhichResultOut = (Variant0Order0 || Variant0Order1) ? 0 : 1;
6670-
OperandOrderOut = (Variant0Order0 || Variant1Order0) ? 0 : 1;
6670+
WhichResultOut = (Result0Order0 || Result0Order1) ? 0 : 1;
6671+
OperandOrderOut = (Result0Order0 || Result1Order0) ? 0 : 1;
66716672
return true;
66726673
}
66736674

0 commit comments

Comments
 (0)