[llvm] ARM: Mark cpsr def dead in FastISel integer extends (PR #227705)

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Fri Oct 2 07:28:27 PDT 2026


https://github.com/arsenm updated https://github.com/llvm/llvm-project/pull/227705

>From 67fd10773c1536a76e387aafe148bcd4a3a62196 Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Tue, 29 Sep 2026 02:37:02 +0200
Subject: [PATCH] ARM: Mark cpsr def dead in FastISel integer extends

Co-authored-by: Claude Opus 5 <noreply at anthropic.com>
---
 llvm/lib/Target/ARM/ARMFastISel.cpp           |  2 +-
 .../CodeGen/ARM/fast-isel-ext-dead-cpsr.ll    | 19 +++++++++++++++++++
 2 files changed, 20 insertions(+), 1 deletion(-)
 create mode 100644 llvm/test/CodeGen/ARM/fast-isel-ext-dead-cpsr.ll

diff --git a/llvm/lib/Target/ARM/ARMFastISel.cpp b/llvm/lib/Target/ARM/ARMFastISel.cpp
index 88ee3156ee3392..e79f8d6557abbb 100644
--- a/llvm/lib/Target/ARM/ARMFastISel.cpp
+++ b/llvm/lib/Target/ARM/ARMFastISel.cpp
@@ -2803,7 +2803,7 @@ Register ARMFastISel::ARMEmitIntExt(MVT SrcVT, Register SrcReg, MVT DestVT,
     MachineInstrBuilder MIB = BuildMI(
         *FuncInfo.MBB, FuncInfo.InsertPt, MIMD, TII.get(Opcode), ResultReg);
     if (setsCPSR)
-      MIB.addReg(ARM::CPSR, RegState::Define);
+      MIB.addReg(ARM::CPSR, RegState::Define | RegState::Dead);
     SrcReg = constrainOperandRegClass(TII.get(Opcode), SrcReg, 1 + setsCPSR);
     MIB.addReg(SrcReg, getKillRegState(isKill))
         .addImm(ImmEnc)
diff --git a/llvm/test/CodeGen/ARM/fast-isel-ext-dead-cpsr.ll b/llvm/test/CodeGen/ARM/fast-isel-ext-dead-cpsr.ll
new file mode 100644
index 00000000000000..30b8534c9ba335
--- /dev/null
+++ b/llvm/test/CodeGen/ARM/fast-isel-ext-dead-cpsr.ll
@@ -0,0 +1,19 @@
+; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6
+; RUN: llc -O0 -fast-isel-abort=1 -mtriple=thumbv7-apple-ios -stop-after=finalize-isel -o - %s | FileCheck %s
+
+; The flags set by the 16-bit Thumb shifts used to extend are dead.
+
+define i32 @sext_1_32(i1 %a) nounwind ssp {
+  ; CHECK-LABEL: name: sext_1_32
+  ; CHECK: bb.0 (%ir-block.0):
+  ; CHECK-NEXT:   liveins: $r0
+  ; CHECK-NEXT: {{  $}}
+  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gpr = COPY $r0
+  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:tgpr = COPY [[COPY]]
+  ; CHECK-NEXT:   %3:tgpr, dead $cpsr = tLSLri [[COPY1]], 31, 14 /* CC::al */, $noreg
+  ; CHECK-NEXT:   %4:tgpr, dead $cpsr = tASRri killed %3, 31, 14 /* CC::al */, $noreg
+  ; CHECK-NEXT:   $r0 = COPY %4
+  ; CHECK-NEXT:   tBX_RET 14 /* CC::al */, $noreg, implicit $r0
+  %r = sext i1 %a to i32
+  ret i32 %r
+}



More information about the llvm-commits mailing list