Skip to content

Commit 0491d8b

Browse files
authored
[AArch64] Treat single-vector ext as legal shuffle masks. (#151909)
We can generate ext from shuffles like <2, 3, 0, 1> from a single vector source. Add handling to isShuffleMaskLegal to allow DAG combines to optimize to it.
1 parent 5923111 commit 0491d8b

File tree

2 files changed

+7
-8
lines changed

2 files changed

+7
-8
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13482,15 +13482,15 @@ static bool isEXTMask(ArrayRef<int> M, EVT VT, bool &ReverseEXT,
1348213482
// Look for the first non-undef element.
1348313483
const int *FirstRealElt = find_if(M, [](int Elt) { return Elt >= 0; });
1348413484

13485-
// Benefit form APInt to handle overflow when calculating expected element.
13485+
// Benefit from APInt to handle overflow when calculating expected element.
1348613486
unsigned NumElts = VT.getVectorNumElements();
1348713487
unsigned MaskBits = APInt(32, NumElts * 2).logBase2();
1348813488
APInt ExpectedElt = APInt(MaskBits, *FirstRealElt + 1, /*isSigned=*/false,
1348913489
/*implicitTrunc=*/true);
1349013490
// The following shuffle indices must be the successive elements after the
1349113491
// first real element.
1349213492
bool FoundWrongElt = std::any_of(FirstRealElt + 1, M.end(), [&](int Elt) {
13493-
return Elt != ExpectedElt++ && Elt != -1;
13493+
return Elt != ExpectedElt++ && Elt >= 0;
1349413494
});
1349513495
if (FoundWrongElt)
1349613496
return false;
@@ -15777,6 +15777,7 @@ bool AArch64TargetLowering::isShuffleMaskLegal(ArrayRef<int> M, EVT VT) const {
1577715777
isREVMask(M, EltSize, NumElts, 32) ||
1577815778
isREVMask(M, EltSize, NumElts, 16) ||
1577915779
isEXTMask(M, VT, DummyBool, DummyUnsigned) ||
15780+
isSingletonEXTMask(M, VT, DummyUnsigned) ||
1578015781
isTRNMask(M, NumElts, DummyUnsigned) ||
1578115782
isUZPMask(M, NumElts, DummyUnsigned) ||
1578215783
isZIPMask(M, NumElts, DummyUnsigned) ||

llvm/test/CodeGen/AArch64/arm64-ext.ll

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -139,9 +139,8 @@ define <2 x ptr> @test_v2p0(<2 x ptr> %a, <2 x ptr> %b) {
139139
define <16 x i8> @reverse_vector_s8x16b(<16 x i8> noundef %x) {
140140
; CHECK-SD-LABEL: reverse_vector_s8x16b:
141141
; CHECK-SD: // %bb.0: // %entry
142-
; CHECK-SD-NEXT: rev64 v1.16b, v0.16b
143-
; CHECK-SD-NEXT: ext v0.16b, v1.16b, v1.16b, #8
144-
; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]
142+
; CHECK-SD-NEXT: rev64 v0.16b, v0.16b
143+
; CHECK-SD-NEXT: ext v0.16b, v0.16b, v0.16b, #8
145144
; CHECK-SD-NEXT: ret
146145
;
147146
; CHECK-GI-LABEL: reverse_vector_s8x16b:
@@ -161,9 +160,8 @@ entry:
161160
define <8 x i16> @reverse_vector_s16x8b(<8 x i16> noundef %x) {
162161
; CHECK-SD-LABEL: reverse_vector_s16x8b:
163162
; CHECK-SD: // %bb.0: // %entry
164-
; CHECK-SD-NEXT: rev64 v1.8h, v0.8h
165-
; CHECK-SD-NEXT: ext v0.16b, v1.16b, v1.16b, #8
166-
; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]
163+
; CHECK-SD-NEXT: rev64 v0.8h, v0.8h
164+
; CHECK-SD-NEXT: ext v0.16b, v0.16b, v0.16b, #8
167165
; CHECK-SD-NEXT: ret
168166
;
169167
; CHECK-GI-LABEL: reverse_vector_s16x8b:

0 commit comments

Comments
 (0)