[llvm] [AArch64][GlobalISel] Legalize BSWAP for Vector Types (PR #80036)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Feb 2 02:36:01 PST 2024
https://github.com/chuongg3 updated https://github.com/llvm/llvm-project/pull/80036
>From ab81b14e3028ff77cf10e6ecfdaee6fe8d5e587e Mon Sep 17 00:00:00 2001
From: Tuan Chuong Goh <chuong.goh at arm.com>
Date: Thu, 25 Jan 2024 14:45:59 +0000
Subject: [PATCH] [AArch64][GlobalISel] Legalize BSWAP for Vector Types
---
llvm/lib/Target/AArch64/AArch64InstrInfo.td | 12 ++
.../GISel/AArch64InstructionSelector.cpp | 37 -----
.../AArch64/GISel/AArch64LegalizerInfo.cpp | 10 +-
.../AArch64/GlobalISel/legalize-bswap.mir | 130 ++++++++++++++----
.../AArch64/GlobalISel/select-bswap.mir | 90 +++++++++---
llvm/test/CodeGen/AArch64/bswap.ll | 9 +-
6 files changed, 196 insertions(+), 92 deletions(-)
diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.td b/llvm/lib/Target/AArch64/AArch64InstrInfo.td
index 6018d662fe514..c476617e679f3 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrInfo.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.td
@@ -5166,6 +5166,18 @@ def : Pat<(v8i16 (concat_vectors
(v4i32 VImm8000)))))),
(SQXTNv8i16 (INSERT_SUBREG (IMPLICIT_DEF), V64:$Vd, dsub), V128:$Vn)>;
+// Select BSWAP vector instructions into REV instructions
+def : Pat<(v4i16 (bswap (v4i16 V64:$Rn))),
+ (v4i16 (REV16v8i8 (v4i16 V64:$Rn)))>;
+def : Pat<(v8i16 (bswap (v8i16 V128:$Rn))),
+ (v8i16 (REV16v16i8 (v8i16 V128:$Rn)))>;
+def : Pat<(v2i32 (bswap (v2i32 V64:$Rn))),
+ (v2i32 (REV32v8i8 (v2i32 V64:$Rn)))>;
+def : Pat<(v4i32 (bswap (v4i32 V128:$Rn))),
+ (v4i32 (REV32v16i8 (v4i32 V128:$Rn)))>;
+def : Pat<(v2i64 (bswap (v2i64 V128:$Rn))),
+ (v2i64 (REV64v16i8 (v2i64 V128:$Rn)))>;
+
//===----------------------------------------------------------------------===//
// Advanced SIMD three vector instructions.
//===----------------------------------------------------------------------===//
diff --git a/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp b/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp
index 48cfb60210d96..2515991fbea11 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp
@@ -2567,43 +2567,6 @@ bool AArch64InstructionSelector::select(MachineInstr &I) {
return constrainSelectedInstRegOperands(*MovAddr, TII, TRI, RBI);
}
- case TargetOpcode::G_BSWAP: {
- // Handle vector types for G_BSWAP directly.
- Register DstReg = I.getOperand(0).getReg();
- LLT DstTy = MRI.getType(DstReg);
-
- // We should only get vector types here; everything else is handled by the
- // importer right now.
- if (!DstTy.isVector() || DstTy.getSizeInBits() > 128) {
- LLVM_DEBUG(dbgs() << "Dst type for G_BSWAP currently unsupported.\n");
- return false;
- }
-
- // Only handle 4 and 2 element vectors for now.
- // TODO: 16-bit elements.
- unsigned NumElts = DstTy.getNumElements();
- if (NumElts != 4 && NumElts != 2) {
- LLVM_DEBUG(dbgs() << "Unsupported number of elements for G_BSWAP.\n");
- return false;
- }
-
- // Choose the correct opcode for the supported types. Right now, that's
- // v2s32, v4s32, and v2s64.
- unsigned Opc = 0;
- unsigned EltSize = DstTy.getElementType().getSizeInBits();
- if (EltSize == 32)
- Opc = (DstTy.getNumElements() == 2) ? AArch64::REV32v8i8
- : AArch64::REV32v16i8;
- else if (EltSize == 64)
- Opc = AArch64::REV64v16i8;
-
- // We should always get something by the time we get here...
- assert(Opc != 0 && "Didn't get an opcode for G_BSWAP?");
-
- I.setDesc(TII.get(Opc));
- return constrainSelectedInstRegOperands(I, TII, TRI, RBI);
- }
-
case TargetOpcode::G_FCONSTANT:
case TargetOpcode::G_CONSTANT: {
const bool isFP = Opcode == TargetOpcode::G_FCONSTANT;
diff --git a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
index 7220efd807c28..cbf5655706e69 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
@@ -118,9 +118,13 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
.clampMaxNumElements(0, p0, 2);
getActionDefinitionsBuilder(G_BSWAP)
- .legalFor({s32, s64, v4s32, v2s32, v2s64})
- .widenScalarToNextPow2(0)
- .clampScalar(0, s32, s64);
+ .legalFor({s32, s64, v4s16, v8s16, v2s32, v4s32, v2s64})
+ .widenScalarOrEltToNextPow2(0, 16)
+ .clampScalar(0, s32, s64)
+ .clampNumElements(0, v4s16, v8s16)
+ .clampNumElements(0, v2s32, v4s32)
+ .clampNumElements(0, v2s64, v2s64)
+ .moreElementsToNextPow2(0);
getActionDefinitionsBuilder({G_ADD, G_SUB, G_MUL, G_AND, G_OR, G_XOR})
.legalFor({s32, s64, v2s32, v2s64, v4s32, v4s16, v8s16, v16s8, v8s8})
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-bswap.mir b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-bswap.mir
index fba0881d4e86f..b0736fb3d777c 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-bswap.mir
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-bswap.mir
@@ -11,12 +11,13 @@ body: |
; CHECK-LABEL: name: bswap_s16
; CHECK: liveins: $w0
- ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
- ; CHECK: [[BSWAP:%[0-9]+]]:_(s32) = G_BSWAP [[COPY]]
- ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 16
- ; CHECK: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[BSWAP]], [[C]](s64)
- ; CHECK: $w0 = COPY [[LSHR]](s32)
- ; CHECK: RET_ReallyLR implicit $w0
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
+ ; CHECK-NEXT: [[BSWAP:%[0-9]+]]:_(s32) = G_BSWAP [[COPY]]
+ ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 16
+ ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[BSWAP]], [[C]](s64)
+ ; CHECK-NEXT: $w0 = COPY [[LSHR]](s32)
+ ; CHECK-NEXT: RET_ReallyLR implicit $w0
%1:_(s32) = COPY $w0
%0:_(s16) = G_TRUNC %1(s32)
%2:_(s16) = G_BSWAP %0
@@ -32,10 +33,11 @@ body: |
liveins: $w0
; CHECK-LABEL: name: bswap_s32_legal
; CHECK: liveins: $w0
- ; CHECK: %copy:_(s32) = COPY $w0
- ; CHECK: %bswap:_(s32) = G_BSWAP %copy
- ; CHECK: $w0 = COPY %bswap(s32)
- ; CHECK: RET_ReallyLR implicit $w0
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: %copy:_(s32) = COPY $w0
+ ; CHECK-NEXT: %bswap:_(s32) = G_BSWAP %copy
+ ; CHECK-NEXT: $w0 = COPY %bswap(s32)
+ ; CHECK-NEXT: RET_ReallyLR implicit $w0
%copy:_(s32) = COPY $w0
%bswap:_(s32) = G_BSWAP %copy
$w0 = COPY %bswap(s32)
@@ -49,16 +51,53 @@ body: |
liveins: $x0
; CHECK-LABEL: name: bswap_s64_legal
; CHECK: liveins: $x0
- ; CHECK: %copy:_(s64) = COPY $x0
- ; CHECK: %bswap:_(s64) = G_BSWAP %copy
- ; CHECK: $x0 = COPY %bswap(s64)
- ; CHECK: RET_ReallyLR implicit $x0
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: %copy:_(s64) = COPY $x0
+ ; CHECK-NEXT: %bswap:_(s64) = G_BSWAP %copy
+ ; CHECK-NEXT: $x0 = COPY %bswap(s64)
+ ; CHECK-NEXT: RET_ReallyLR implicit $x0
%copy:_(s64) = COPY $x0
%bswap:_(s64) = G_BSWAP %copy
$x0 = COPY %bswap(s64)
RET_ReallyLR implicit $x0
...
---
+name: bswap_v4s16_legal
+tracksRegLiveness: true
+body: |
+ bb.0:
+ liveins: $d0
+ ; CHECK-LABEL: name: bswap_v4s16_legal
+ ; CHECK: liveins: $d0
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: %copy:_(<4 x s16>) = COPY $d0
+ ; CHECK-NEXT: %bswap:_(<4 x s16>) = G_BSWAP %copy
+ ; CHECK-NEXT: $d0 = COPY %bswap(<4 x s16>)
+ ; CHECK-NEXT: RET_ReallyLR implicit $d0
+ %copy:_(<4 x s16>) = COPY $d0
+ %bswap:_(<4 x s16>) = G_BSWAP %copy
+ $d0 = COPY %bswap(<4 x s16>)
+ RET_ReallyLR implicit $d0
+...
+---
+name: bswap_v8s16_legal
+tracksRegLiveness: true
+body: |
+ bb.0:
+ liveins: $q0
+ ; CHECK-LABEL: name: bswap_v8s16_legal
+ ; CHECK: liveins: $q0
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: %copy:_(<8 x s16>) = COPY $q0
+ ; CHECK-NEXT: %bswap:_(<8 x s16>) = G_BSWAP %copy
+ ; CHECK-NEXT: $q0 = COPY %bswap(<8 x s16>)
+ ; CHECK-NEXT: RET_ReallyLR implicit $q0
+ %copy:_(<8 x s16>) = COPY $q0
+ %bswap:_(<8 x s16>) = G_BSWAP %copy
+ $q0 = COPY %bswap(<8 x s16>)
+ RET_ReallyLR implicit $q0
+...
+---
name: bswap_v4s32_legal
tracksRegLiveness: true
body: |
@@ -66,10 +105,11 @@ body: |
liveins: $q0
; CHECK-LABEL: name: bswap_v4s32_legal
; CHECK: liveins: $q0
- ; CHECK: %copy:_(<4 x s32>) = COPY $q0
- ; CHECK: %bswap:_(<4 x s32>) = G_BSWAP %copy
- ; CHECK: $q0 = COPY %bswap(<4 x s32>)
- ; CHECK: RET_ReallyLR implicit $q0
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: %copy:_(<4 x s32>) = COPY $q0
+ ; CHECK-NEXT: %bswap:_(<4 x s32>) = G_BSWAP %copy
+ ; CHECK-NEXT: $q0 = COPY %bswap(<4 x s32>)
+ ; CHECK-NEXT: RET_ReallyLR implicit $q0
%copy:_(<4 x s32>) = COPY $q0
%bswap:_(<4 x s32>) = G_BSWAP %copy
$q0 = COPY %bswap(<4 x s32>)
@@ -83,10 +123,11 @@ body: |
liveins: $d0
; CHECK-LABEL: name: bswap_v2s32_legal
; CHECK: liveins: $d0
- ; CHECK: %copy:_(<2 x s32>) = COPY $d0
- ; CHECK: %bswap:_(<2 x s32>) = G_BSWAP %copy
- ; CHECK: $d0 = COPY %bswap(<2 x s32>)
- ; CHECK: RET_ReallyLR implicit $d0
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: %copy:_(<2 x s32>) = COPY $d0
+ ; CHECK-NEXT: %bswap:_(<2 x s32>) = G_BSWAP %copy
+ ; CHECK-NEXT: $d0 = COPY %bswap(<2 x s32>)
+ ; CHECK-NEXT: RET_ReallyLR implicit $d0
%copy:_(<2 x s32>) = COPY $d0
%bswap:_(<2 x s32>) = G_BSWAP %copy
$d0 = COPY %bswap(<2 x s32>)
@@ -100,10 +141,11 @@ body: |
liveins: $q0
; CHECK-LABEL: name: bswap_v2s64_legal
; CHECK: liveins: $q0
- ; CHECK: %copy:_(<2 x s64>) = COPY $q0
- ; CHECK: %bswap:_(<2 x s64>) = G_BSWAP %copy
- ; CHECK: $q0 = COPY %bswap(<2 x s64>)
- ; CHECK: RET_ReallyLR implicit $q0
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: %copy:_(<2 x s64>) = COPY $q0
+ ; CHECK-NEXT: %bswap:_(<2 x s64>) = G_BSWAP %copy
+ ; CHECK-NEXT: $q0 = COPY %bswap(<2 x s64>)
+ ; CHECK-NEXT: RET_ReallyLR implicit $q0
%copy:_(<2 x s64>) = COPY $q0
%bswap:_(<2 x s64>) = G_BSWAP %copy
$q0 = COPY %bswap(<2 x s64>)
@@ -134,3 +176,39 @@ body: |
$x0 = COPY %trunc(s64)
RET_ReallyLR implicit $x0
...
+---
+name: bswap_v2s48
+tracksRegLiveness: true
+body: |
+ bb.0:
+ liveins: $q0, $x8
+ ; CHECK-LABEL: name: bswap_v2s48
+ ; CHECK: liveins: $q0, $x8
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x8
+ ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s64>) = COPY $q0
+ ; CHECK-NEXT: [[BSWAP:%[0-9]+]]:_(<2 x s64>) = G_BSWAP [[COPY1]]
+ ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 16
+ ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s64>) = G_BUILD_VECTOR [[C]](s64), [[C]](s64)
+ ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(<2 x s64>) = G_LSHR [[BSWAP]], [[BUILD_VECTOR]](<2 x s64>)
+ ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s64), [[UV1:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[LSHR]](<2 x s64>)
+ ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 32
+ ; CHECK-NEXT: [[LSHR1:%[0-9]+]]:_(s64) = G_LSHR [[UV]], [[C1]](s64)
+ ; CHECK-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 4
+ ; CHECK-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C2]](s64)
+ ; CHECK-NEXT: G_STORE [[UV]](s64), [[COPY]](p0) :: (store (s32), align 16)
+ ; CHECK-NEXT: G_STORE [[LSHR1]](s64), [[PTR_ADD]](p0) :: (store (s16) into unknown-address + 4, align 4)
+ ; CHECK-NEXT: [[C3:%[0-9]+]]:_(s64) = G_CONSTANT i64 6
+ ; CHECK-NEXT: [[PTR_ADD1:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C3]](s64)
+ ; CHECK-NEXT: [[LSHR2:%[0-9]+]]:_(s64) = G_LSHR [[UV1]], [[C1]](s64)
+ ; CHECK-NEXT: [[PTR_ADD2:%[0-9]+]]:_(p0) = G_PTR_ADD [[PTR_ADD1]], [[C2]](s64)
+ ; CHECK-NEXT: G_STORE [[UV1]](s64), [[PTR_ADD1]](p0) :: (store (s32) into unknown-address + 6, align 2)
+ ; CHECK-NEXT: G_STORE [[LSHR2]](s64), [[PTR_ADD2]](p0) :: (store (s16) into unknown-address + 10)
+ ; CHECK-NEXT: RET_ReallyLR
+ %1:_(p0) = COPY $x8
+ %2:_(<2 x s64>) = COPY $q0
+ %0:_(<2 x s48>) = G_TRUNC %2:_(<2 x s64>)
+ %bswap:_(<2 x s48>) = G_BSWAP %0
+ G_STORE %bswap:_(<2 x s48>), %1:_(p0) :: (store (<2 x s48>), align 16)
+ RET_ReallyLR
+...
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/select-bswap.mir b/llvm/test/CodeGen/AArch64/GlobalISel/select-bswap.mir
index 77c03073033c0..5e0121682e327 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/select-bswap.mir
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/select-bswap.mir
@@ -16,9 +16,11 @@ body: |
liveins: $w0
; CHECK-LABEL: name: bswap_s32
- ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY $w0
- ; CHECK: [[REVWr:%[0-9]+]]:gpr32 = REVWr [[COPY]]
- ; CHECK: $w0 = COPY [[REVWr]]
+ ; CHECK: liveins: $w0
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32 = COPY $w0
+ ; CHECK-NEXT: [[REVWr:%[0-9]+]]:gpr32 = REVWr [[COPY]]
+ ; CHECK-NEXT: $w0 = COPY [[REVWr]]
%0(s32) = COPY $w0
%1(s32) = G_BSWAP %0
$w0 = COPY %1
@@ -38,13 +40,62 @@ body: |
liveins: $x0
; CHECK-LABEL: name: bswap_s64
- ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
- ; CHECK: [[REVXr:%[0-9]+]]:gpr64 = REVXr [[COPY]]
- ; CHECK: $x0 = COPY [[REVXr]]
+ ; CHECK: liveins: $x0
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
+ ; CHECK-NEXT: [[REVXr:%[0-9]+]]:gpr64 = REVXr [[COPY]]
+ ; CHECK-NEXT: $x0 = COPY [[REVXr]]
%0(s64) = COPY $x0
%1(s64) = G_BSWAP %0
$x0 = COPY %1
+...
+---
+name: bswap_v4s16
+alignment: 4
+legalized: true
+regBankSelected: true
+tracksRegLiveness: true
+machineFunctionInfo: {}
+body: |
+ bb.0:
+ liveins: $d0
+
+ ; CHECK-LABEL: name: bswap_v4s16
+ ; CHECK: liveins: $d0
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr64 = COPY $d0
+ ; CHECK-NEXT: [[REV16v8i8_:%[0-9]+]]:fpr64 = REV16v8i8 [[COPY]]
+ ; CHECK-NEXT: $d0 = COPY [[REV16v8i8_]]
+ ; CHECK-NEXT: RET_ReallyLR implicit $d0
+ %0:fpr(<4 x s16>) = COPY $d0
+ %1:fpr(<4 x s16>) = G_BSWAP %0
+ $d0 = COPY %1(<4 x s16>)
+ RET_ReallyLR implicit $d0
+
+...
+---
+name: bswap_v8s16
+alignment: 4
+legalized: true
+regBankSelected: true
+tracksRegLiveness: true
+machineFunctionInfo: {}
+body: |
+ bb.0:
+ liveins: $q0
+ ; CHECK-LABEL: name: bswap_v8s16
+ ; CHECK: liveins: $q0
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr128 = COPY $q0
+ ; CHECK-NEXT: [[REV16v16i8_:%[0-9]+]]:fpr128 = REV16v16i8 [[COPY]]
+ ; CHECK-NEXT: $q0 = COPY [[REV16v16i8_]]
+ ; CHECK-NEXT: RET_ReallyLR implicit $q0
+ %0:fpr(<8 x s16>) = COPY $q0
+ %1:fpr(<8 x s16>) = G_BSWAP %0
+ $q0 = COPY %1(<8 x s16>)
+ RET_ReallyLR implicit $q0
+
...
---
name: bswap_v4s32
@@ -59,10 +110,11 @@ body: |
; CHECK-LABEL: name: bswap_v4s32
; CHECK: liveins: $q0
- ; CHECK: [[COPY:%[0-9]+]]:fpr128 = COPY $q0
- ; CHECK: [[REV32v16i8_:%[0-9]+]]:fpr128 = REV32v16i8 [[COPY]]
- ; CHECK: $q0 = COPY [[REV32v16i8_]]
- ; CHECK: RET_ReallyLR implicit $q0
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr128 = COPY $q0
+ ; CHECK-NEXT: [[REV32v16i8_:%[0-9]+]]:fpr128 = REV32v16i8 [[COPY]]
+ ; CHECK-NEXT: $q0 = COPY [[REV32v16i8_]]
+ ; CHECK-NEXT: RET_ReallyLR implicit $q0
%0:fpr(<4 x s32>) = COPY $q0
%1:fpr(<4 x s32>) = G_BSWAP %0
$q0 = COPY %1(<4 x s32>)
@@ -82,10 +134,11 @@ body: |
; CHECK-LABEL: name: bswap_v2s32
; CHECK: liveins: $d0
- ; CHECK: [[COPY:%[0-9]+]]:fpr64 = COPY $d0
- ; CHECK: [[REV32v8i8_:%[0-9]+]]:fpr64 = REV32v8i8 [[COPY]]
- ; CHECK: $d0 = COPY [[REV32v8i8_]]
- ; CHECK: RET_ReallyLR implicit $d0
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr64 = COPY $d0
+ ; CHECK-NEXT: [[REV32v8i8_:%[0-9]+]]:fpr64 = REV32v8i8 [[COPY]]
+ ; CHECK-NEXT: $d0 = COPY [[REV32v8i8_]]
+ ; CHECK-NEXT: RET_ReallyLR implicit $d0
%0:fpr(<2 x s32>) = COPY $d0
%1:fpr(<2 x s32>) = G_BSWAP %0
$d0 = COPY %1(<2 x s32>)
@@ -105,10 +158,11 @@ body: |
; CHECK-LABEL: name: bswap_v2s64
; CHECK: liveins: $q0
- ; CHECK: [[COPY:%[0-9]+]]:fpr128 = COPY $q0
- ; CHECK: [[REV64v16i8_:%[0-9]+]]:fpr128 = REV64v16i8 [[COPY]]
- ; CHECK: $q0 = COPY [[REV64v16i8_]]
- ; CHECK: RET_ReallyLR implicit $q0
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr128 = COPY $q0
+ ; CHECK-NEXT: [[REV64v16i8_:%[0-9]+]]:fpr128 = REV64v16i8 [[COPY]]
+ ; CHECK-NEXT: $q0 = COPY [[REV64v16i8_]]
+ ; CHECK-NEXT: RET_ReallyLR implicit $q0
%0:fpr(<2 x s64>) = COPY $q0
%1:fpr(<2 x s64>) = G_BSWAP %0
$q0 = COPY %1(<2 x s64>)
diff --git a/llvm/test/CodeGen/AArch64/bswap.ll b/llvm/test/CodeGen/AArch64/bswap.ll
index d09327a8da42d..6df62a00a8f8f 100644
--- a/llvm/test/CodeGen/AArch64/bswap.ll
+++ b/llvm/test/CodeGen/AArch64/bswap.ll
@@ -2,14 +2,7 @@
; RUN: llc -mtriple=aarch64 %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD
; RUN: llc -mtriple=aarch64 -global-isel -global-isel-abort=2 %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
-; CHECK-GI: warning: Instruction selection used fallback path for bswap_v8i16
-; CHECK-GI-NEXT: warning: Instruction selection used fallback path for bswap_v2i16
-; CHECK-GI-NEXT: warning: Instruction selection used fallback path for bswap_v16i16
-; CHECK-GI-NEXT: warning: Instruction selection used fallback path for bswap_v8i32
-; CHECK-GI-NEXT: warning: Instruction selection used fallback path for bswap_v4i64
-; CHECK-GI-NEXT: warning: Instruction selection used fallback path for bswap_v3i16
-; CHECK-GI-NEXT: warning: Instruction selection used fallback path for bswap_v7i16
-; CHECK-GI-NEXT: warning: Instruction selection used fallback path for bswap_v3i32
+; CHECK-GI: warning: Instruction selection used fallback path for bswap_v2i16
; ====== Scalar Tests =====
define i16 @bswap_i16(i16 %a){
More information about the llvm-commits
mailing list