[llvm] 215aca4 - [GlobalISel] SBFX/UBFX does not create poison (#165675)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 31 02:18:11 PDT 2025
Author: David Green
Date: 2025-10-31T09:18:07Z
New Revision: 215aca4432fc47d71f1d5e6fdbe2ed342bb3dea6
URL: https://github.com/llvm/llvm-project/commit/215aca4432fc47d71f1d5e6fdbe2ed342bb3dea6
DIFF: https://github.com/llvm/llvm-project/commit/215aca4432fc47d71f1d5e6fdbe2ed342bb3dea6.diff
LOG: [GlobalISel] SBFX/UBFX does not create poison (#165675)
This adds G_SBFX/G_UBFX to the list of instructions that do not generate
poison, to allowing freeze to be hoisted above one.
Added:
Modified:
llvm/lib/CodeGen/GlobalISel/Utils.cpp
llvm/test/CodeGen/AArch64/GlobalISel/combine-freeze.mir
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/GlobalISel/Utils.cpp b/llvm/lib/CodeGen/GlobalISel/Utils.cpp
index ca82857319abc..5fab6ec506e94 100644
--- a/llvm/lib/CodeGen/GlobalISel/Utils.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/Utils.cpp
@@ -1893,6 +1893,8 @@ static bool canCreateUndefOrPoison(Register Reg, const MachineRegisterInfo &MRI,
case TargetOpcode::G_UADDSAT:
case TargetOpcode::G_SSUBSAT:
case TargetOpcode::G_USUBSAT:
+ case TargetOpcode::G_SBFX:
+ case TargetOpcode::G_UBFX:
return false;
case TargetOpcode::G_SSHLSAT:
case TargetOpcode::G_USHLSAT:
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/combine-freeze.mir b/llvm/test/CodeGen/AArch64/GlobalISel/combine-freeze.mir
index 6b84a8488e478..1950e602ec83a 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/combine-freeze.mir
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/combine-freeze.mir
@@ -1440,3 +1440,50 @@ body: |
%freeze:_(<4 x s32>) = G_FREEZE %extract
$q0 = COPY %freeze(<4 x s32>)
RET_ReallyLR implicit $x0
+...
+---
+name: ubfx_does_not_generate_poison
+body: |
+ bb.1:
+ liveins: $w0
+
+ ; CHECK-LABEL: name: ubfx_does_not_generate_poison
+ ; CHECK: liveins: $w0
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
+ ; CHECK-NEXT: %c1:_(s64) = G_CONSTANT i64 1
+ ; CHECK-NEXT: [[FREEZE:%[0-9]+]]:_(s64) = G_FREEZE [[COPY]]
+ ; CHECK-NEXT: [[UBFX:%[0-9]+]]:_(s64) = G_UBFX [[FREEZE]], %c1(s64), %c1
+ ; CHECK-NEXT: $x0 = COPY [[UBFX]](s64)
+ ; CHECK-NEXT: RET_ReallyLR implicit $x0
+ %0:_(s64) = COPY $x0
+ %c1:_(s64) = G_CONSTANT i64 1
+ %1:_(s64) = G_UBFX %0, %c1, %c1
+ %2:_(s64) = G_FREEZE %1
+ $x0 = COPY %2(s64)
+ RET_ReallyLR implicit $x0
+
+...
+---
+name: sbfx_does_not_generate_poison
+body: |
+ bb.1:
+ liveins: $w0
+
+ ; CHECK-LABEL: name: sbfx_does_not_generate_poison
+ ; CHECK: liveins: $w0
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
+ ; CHECK-NEXT: %c1:_(s64) = G_CONSTANT i64 1
+ ; CHECK-NEXT: [[FREEZE:%[0-9]+]]:_(s64) = G_FREEZE [[COPY]]
+ ; CHECK-NEXT: [[SBFX:%[0-9]+]]:_(s64) = G_SBFX [[FREEZE]], %c1(s64), %c1
+ ; CHECK-NEXT: $x0 = COPY [[SBFX]](s64)
+ ; CHECK-NEXT: RET_ReallyLR implicit $x0
+ %0:_(s64) = COPY $x0
+ %c1:_(s64) = G_CONSTANT i64 1
+ %1:_(s64) = G_SBFX %0, %c1, %c1
+ %2:_(s64) = G_FREEZE %1
+ $x0 = COPY %2(s64)
+ RET_ReallyLR implicit $x0
+
+...
More information about the llvm-commits
mailing list