[llvm] 3ac9aa2 - [GlobalIsel][X86] Legalize G_BSWAP III
Thorsten Schütt via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 2 02:42:32 PDT 2023
Author: Thorsten Schütt
Date: 2023-06-02T11:42:25+02:00
New Revision: 3ac9aa20205e559b05502b30f183ee6ff4dda847
URL: https://github.com/llvm/llvm-project/commit/3ac9aa20205e559b05502b30f183ee6ff4dda847
DIFF: https://github.com/llvm/llvm-project/commit/3ac9aa20205e559b05502b30f183ee6ff4dda847.diff
LOG: [GlobalIsel][X86] Legalize G_BSWAP III
Reviewed By: RKSimon
Differential Revision: https://reviews.llvm.org/D151915
Added:
llvm/test/CodeGen/X86/GlobalISel/legalize-bswap.mir
Modified:
llvm/lib/Target/X86/X86LegalizerInfo.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/X86/X86LegalizerInfo.cpp b/llvm/lib/Target/X86/X86LegalizerInfo.cpp
index a85c33519d38d..8d0034bf06f8f 100644
--- a/llvm/lib/Target/X86/X86LegalizerInfo.cpp
+++ b/llvm/lib/Target/X86/X86LegalizerInfo.cpp
@@ -75,6 +75,7 @@ X86LegalizerInfo::X86LegalizerInfo(const X86Subtarget &STI,
const LLT s16 = LLT::scalar(16);
const LLT s32 = LLT::scalar(32);
const LLT s64 = LLT::scalar(64);
+ const LLT maxScalar = Subtarget.is64Bit() ? s64 : s32;
getActionDefinitionsBuilder(G_INTRINSIC_ROUNDEVEN)
.scalarize(0)
@@ -97,6 +98,13 @@ X86LegalizerInfo::X86LegalizerInfo(const X86Subtarget &STI,
getActionDefinitionsBuilder({G_MEMCPY, G_MEMMOVE, G_MEMSET}).libcall();
+ getActionDefinitionsBuilder(G_BSWAP)
+ .legalIf([=](const LegalityQuery &Query) {
+ return Query.Types[0] == s32 ||
+ (Subtarget.is64Bit() && Query.Types[0] == s64);
+ })
+ .widenScalarToNextPow2(0, /*Min=*/32)
+ .clampScalar(0, s32, maxScalar);
if (Subtarget.is64Bit()) {
if (Subtarget.hasPOPCNT()) {
diff --git a/llvm/test/CodeGen/X86/GlobalISel/legalize-bswap.mir b/llvm/test/CodeGen/X86/GlobalISel/legalize-bswap.mir
new file mode 100644
index 0000000000000..bdac19b090d22
--- /dev/null
+++ b/llvm/test/CodeGen/X86/GlobalISel/legalize-bswap.mir
@@ -0,0 +1,106 @@
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 2
+# RUN: llc -mtriple=i386-linux-gnu -run-pass=legalizer %s -o - | FileCheck %s --check-prefix=X86-32
+# RUN: llc -mtriple=x86_64-linux-gnu -run-pass=legalizer %s -o - | FileCheck %s --check-prefix=X86-64
+
+# test bswap for s16, s17, s32, and s64
+
+...
+---
+name: test_bswap17
+body: |
+ bb.1:
+ ; X86-32-LABEL: name: test_bswap17
+ ; X86-32: [[DEF:%[0-9]+]]:_(s17) = IMPLICIT_DEF
+ ; X86-32-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[DEF]](s17)
+ ; X86-32-NEXT: [[BSWAP:%[0-9]+]]:_(s32) = G_BSWAP [[ANYEXT]]
+ ; X86-32-NEXT: [[C:%[0-9]+]]:_(s8) = G_CONSTANT i8 15
+ ; X86-32-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[BSWAP]], [[C]](s8)
+ ; X86-32-NEXT: [[TRUNC:%[0-9]+]]:_(s17) = G_TRUNC [[LSHR]](s32)
+ ; X86-32-NEXT: [[COPY:%[0-9]+]]:_(s17) = COPY [[TRUNC]](s17)
+ ; X86-32-NEXT: RET 0, implicit [[COPY]](s17)
+ ; X86-64-LABEL: name: test_bswap17
+ ; X86-64: [[DEF:%[0-9]+]]:_(s17) = IMPLICIT_DEF
+ ; X86-64-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[DEF]](s17)
+ ; X86-64-NEXT: [[BSWAP:%[0-9]+]]:_(s32) = G_BSWAP [[ANYEXT]]
+ ; X86-64-NEXT: [[C:%[0-9]+]]:_(s8) = G_CONSTANT i8 15
+ ; X86-64-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[BSWAP]], [[C]](s8)
+ ; X86-64-NEXT: [[TRUNC:%[0-9]+]]:_(s17) = G_TRUNC [[LSHR]](s32)
+ ; X86-64-NEXT: [[COPY:%[0-9]+]]:_(s17) = COPY [[TRUNC]](s17)
+ ; X86-64-NEXT: RET 0, implicit [[COPY]](s17)
+ %0:_(s17) = IMPLICIT_DEF
+ %1:_(s17) = G_BSWAP %0
+ %2:_(s17) = COPY %1(s17)
+ RET 0, implicit %2
+
+...
+---
+name: test_bswap64
+body: |
+ bb.1:
+ ; X86-32-LABEL: name: test_bswap64
+ ; X86-32: [[DEF:%[0-9]+]]:_(s64) = IMPLICIT_DEF
+ ; X86-32-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[DEF]](s64)
+ ; X86-32-NEXT: [[BSWAP:%[0-9]+]]:_(s32) = G_BSWAP [[UV1]]
+ ; X86-32-NEXT: [[BSWAP1:%[0-9]+]]:_(s32) = G_BSWAP [[UV]]
+ ; X86-32-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[BSWAP]](s32), [[BSWAP1]](s32)
+ ; X86-32-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY [[MV]](s64)
+ ; X86-32-NEXT: RET 0, implicit [[COPY]](s64)
+ ; X86-64-LABEL: name: test_bswap64
+ ; X86-64: [[DEF:%[0-9]+]]:_(s64) = IMPLICIT_DEF
+ ; X86-64-NEXT: [[BSWAP:%[0-9]+]]:_(s64) = G_BSWAP [[DEF]]
+ ; X86-64-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY [[BSWAP]](s64)
+ ; X86-64-NEXT: RET 0, implicit [[COPY]](s64)
+ %0:_(s64) = IMPLICIT_DEF
+ %1:_(s64) = G_BSWAP %0
+ %2:_(s64) = COPY %1(s64)
+ RET 0, implicit %2
+
+...
+---
+name: test_bswap32
+body: |
+ bb.1:
+ ; X86-32-LABEL: name: test_bswap32
+ ; X86-32: [[DEF:%[0-9]+]]:_(s32) = IMPLICIT_DEF
+ ; X86-32-NEXT: [[BSWAP:%[0-9]+]]:_(s32) = G_BSWAP [[DEF]]
+ ; X86-32-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY [[BSWAP]](s32)
+ ; X86-32-NEXT: RET 0, implicit [[COPY]](s32)
+ ; X86-64-LABEL: name: test_bswap32
+ ; X86-64: [[DEF:%[0-9]+]]:_(s32) = IMPLICIT_DEF
+ ; X86-64-NEXT: [[BSWAP:%[0-9]+]]:_(s32) = G_BSWAP [[DEF]]
+ ; X86-64-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY [[BSWAP]](s32)
+ ; X86-64-NEXT: RET 0, implicit [[COPY]](s32)
+ %0:_(s32) = IMPLICIT_DEF
+ %1:_(s32) = G_BSWAP %0
+ %2:_(s32) = COPY %1(s32)
+ RET 0, implicit %2
+
+...
+---
+name: test_bswap16
+body: |
+ bb.1:
+ ; X86-32-LABEL: name: test_bswap16
+ ; X86-32: [[DEF:%[0-9]+]]:_(s16) = IMPLICIT_DEF
+ ; X86-32-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[DEF]](s16)
+ ; X86-32-NEXT: [[BSWAP:%[0-9]+]]:_(s32) = G_BSWAP [[ANYEXT]]
+ ; X86-32-NEXT: [[C:%[0-9]+]]:_(s8) = G_CONSTANT i8 16
+ ; X86-32-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[BSWAP]], [[C]](s8)
+ ; X86-32-NEXT: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[LSHR]](s32)
+ ; X86-32-NEXT: [[COPY:%[0-9]+]]:_(s16) = COPY [[TRUNC]](s16)
+ ; X86-32-NEXT: RET 0, implicit [[COPY]](s16)
+ ; X86-64-LABEL: name: test_bswap16
+ ; X86-64: [[DEF:%[0-9]+]]:_(s16) = IMPLICIT_DEF
+ ; X86-64-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[DEF]](s16)
+ ; X86-64-NEXT: [[BSWAP:%[0-9]+]]:_(s32) = G_BSWAP [[ANYEXT]]
+ ; X86-64-NEXT: [[C:%[0-9]+]]:_(s8) = G_CONSTANT i8 16
+ ; X86-64-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[BSWAP]], [[C]](s8)
+ ; X86-64-NEXT: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[LSHR]](s32)
+ ; X86-64-NEXT: [[COPY:%[0-9]+]]:_(s16) = COPY [[TRUNC]](s16)
+ ; X86-64-NEXT: RET 0, implicit [[COPY]](s16)
+ %0:_(s16) = IMPLICIT_DEF
+ %1:_(s16) = G_BSWAP %0
+ %2:_(s16) = COPY %1(s16)
+ RET 0, implicit %2
+
+...
More information about the llvm-commits
mailing list