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

via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 30 06:19:50 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-arm

Author: Matt Arsenault (arsenm)

<details>
<summary>Changes</summary>

Co-authored-by: Claude Opus 5 <noreply@<!-- -->anthropic.com>

---
Full diff: https://github.com/llvm/llvm-project/pull/227705.diff


2 Files Affected:

- (modified) llvm/lib/Target/ARM/ARMFastISel.cpp (+1-1) 
- (added) llvm/test/CodeGen/ARM/fast-isel-ext-dead-cpsr.ll (+19) 


``````````diff
diff --git a/llvm/lib/Target/ARM/ARMFastISel.cpp b/llvm/lib/Target/ARM/ARMFastISel.cpp
index 88ee3156ee339..e79f8d6557abb 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 0000000000000..30b8534c9ba33
--- /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
+}

``````````

</details>


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


More information about the llvm-commits mailing list