[llvm] ARM: Mark __chkstk call's implicit LR def dead (PR #227218)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 29 01:47:22 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-arm
Author: Matt Arsenault (arsenm)
<details>
<summary>Changes</summary>
The WIN__CHKSTK custom inserter already marks the clobbered R12 and CPSR
defs dead, but left the call's implicit-def $lr for later inference.
Co-Authored-By: Claude Opus 5 <noreply@<!-- -->anthropic.com>
---
Full diff: https://github.com/llvm/llvm-project/pull/227218.diff
3 Files Affected:
- (modified) llvm/lib/Target/ARM/ARMISelLowering.cpp (+2)
- (added) llvm/test/CodeGen/ARM/Windows/chkstk-dead-lr.ll (+39)
- (modified) llvm/test/CodeGen/ARM/Windows/vla-cpsr.ll (+1-1)
``````````diff
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp
index 7e5f6134fc88b..2f4a4b47677c5 100644
--- a/llvm/lib/Target/ARM/ARMISelLowering.cpp
+++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp
@@ -11751,6 +11751,7 @@ ARMTargetLowering::EmitLowered__chkstk(MachineInstr &MI,
BuildMI(*MBB, MI, DL, TII.get(ARM::tBL))
.add(predOps(ARMCC::AL))
.addExternalSymbol(ChkStk)
+ .setOperandDead(3) // implicit-def $lr
.addReg(ARM::R4, RegState::Implicit | RegState::Kill)
.addReg(ARM::R4, RegState::Implicit | RegState::Define)
.addReg(ARM::R12,
@@ -11767,6 +11768,7 @@ ARMTargetLowering::EmitLowered__chkstk(MachineInstr &MI,
BuildMI(*MBB, MI, DL, TII.get(gettBLXrOpcode(*MBB->getParent())))
.add(predOps(ARMCC::AL))
.addReg(Reg, RegState::Kill)
+ .setOperandDead(3) // implicit-def $lr
.addReg(ARM::R4, RegState::Implicit | RegState::Kill)
.addReg(ARM::R4, RegState::Implicit | RegState::Define)
.addReg(ARM::R12,
diff --git a/llvm/test/CodeGen/ARM/Windows/chkstk-dead-lr.ll b/llvm/test/CodeGen/ARM/Windows/chkstk-dead-lr.ll
new file mode 100644
index 0000000000000..6e315c8a4897d
--- /dev/null
+++ b/llvm/test/CodeGen/ARM/Windows/chkstk-dead-lr.ll
@@ -0,0 +1,39 @@
+; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6
+; RUN: llc -mtriple=thumbv7-windows-itanium -stop-after=finalize-isel -o - %s | FileCheck -check-prefix=SMALL %s
+; RUN: llc -mtriple=thumbv7-windows-itanium -code-model=large -stop-after=finalize-isel -o - %s | FileCheck -check-prefix=LARGE %s
+
+define ptr @vla(i32 %n) {
+ ; SMALL-LABEL: name: vla
+ ; SMALL: bb.0.entry:
+ ; SMALL-NEXT: liveins: $r0
+ ; SMALL-NEXT: {{ $}}
+ ; SMALL-NEXT: [[COPY:%[0-9]+]]:gprnopc = COPY $r0
+ ; SMALL-NEXT: [[t2ADDri:%[0-9]+]]:rgpr = nuw t2ADDri [[COPY]], 7, 14 /* CC::al */, $noreg, $noreg
+ ; SMALL-NEXT: [[t2BICri:%[0-9]+]]:rgpr = t2BICri killed [[t2ADDri]], 4, 14 /* CC::al */, $noreg, $noreg
+ ; SMALL-NEXT: [[t2LSRri:%[0-9]+]]:rgpr = t2LSRri killed [[t2BICri]], 2, 14 /* CC::al */, $noreg, $noreg
+ ; SMALL-NEXT: $r4 = COPY [[t2LSRri]]
+ ; SMALL-NEXT: tBL 14 /* CC::al */, $noreg, &__chkstk, implicit-def dead $lr, implicit $sp, implicit killed $r4, implicit-def $r4, implicit-def dead $r12, implicit-def dead $cpsr
+ ; SMALL-NEXT: $sp = frame-setup t2SUBrr killed $sp, killed $r4, 14 /* CC::al */, $noreg, $noreg
+ ; SMALL-NEXT: [[COPY1:%[0-9]+]]:gpr = COPY $sp
+ ; SMALL-NEXT: $r0 = COPY [[COPY1]]
+ ; SMALL-NEXT: tBX_RET 14 /* CC::al */, $noreg, implicit $r0
+ ;
+ ; LARGE-LABEL: name: vla
+ ; LARGE: bb.0.entry:
+ ; LARGE-NEXT: liveins: $r0
+ ; LARGE-NEXT: {{ $}}
+ ; LARGE-NEXT: [[COPY:%[0-9]+]]:gprnopc = COPY $r0
+ ; LARGE-NEXT: [[t2ADDri:%[0-9]+]]:rgpr = nuw t2ADDri [[COPY]], 7, 14 /* CC::al */, $noreg, $noreg
+ ; LARGE-NEXT: [[t2BICri:%[0-9]+]]:rgpr = t2BICri killed [[t2ADDri]], 4, 14 /* CC::al */, $noreg, $noreg
+ ; LARGE-NEXT: [[t2LSRri:%[0-9]+]]:rgpr = t2LSRri killed [[t2BICri]], 2, 14 /* CC::al */, $noreg, $noreg
+ ; LARGE-NEXT: $r4 = COPY [[t2LSRri]]
+ ; LARGE-NEXT: [[t2MOVi32imm:%[0-9]+]]:rgpr = t2MOVi32imm &__chkstk
+ ; LARGE-NEXT: tBLXr 14 /* CC::al */, $noreg, killed [[t2MOVi32imm]], implicit-def dead $lr, implicit $sp, implicit killed $r4, implicit-def $r4, implicit-def dead $r12, implicit-def dead $cpsr
+ ; LARGE-NEXT: $sp = frame-setup t2SUBrr killed $sp, killed $r4, 14 /* CC::al */, $noreg, $noreg
+ ; LARGE-NEXT: [[COPY1:%[0-9]+]]:gpr = COPY $sp
+ ; LARGE-NEXT: $r0 = COPY [[COPY1]]
+ ; LARGE-NEXT: tBX_RET 14 /* CC::al */, $noreg, implicit $r0
+entry:
+ %buffer = alloca i8, i32 %n, align 1
+ ret ptr %buffer
+}
diff --git a/llvm/test/CodeGen/ARM/Windows/vla-cpsr.ll b/llvm/test/CodeGen/ARM/Windows/vla-cpsr.ll
index 5d51775851ecd..444eae845ac92 100644
--- a/llvm/test/CodeGen/ARM/Windows/vla-cpsr.ll
+++ b/llvm/test/CodeGen/ARM/Windows/vla-cpsr.ll
@@ -9,5 +9,5 @@ entry:
ret void
}
-; CHECK: tBL 14, $noreg, &__chkstk, implicit-def $lr, implicit $sp, implicit killed $r4, implicit-def $r4, implicit-def dead $r12, implicit-def dead $cpsr
+; CHECK: tBL 14, $noreg, &__chkstk, implicit-def dead $lr, implicit $sp, implicit killed $r4, implicit-def $r4, implicit-def dead $r12, implicit-def dead $cpsr
``````````
</details>
https://github.com/llvm/llvm-project/pull/227218
More information about the llvm-commits
mailing list