[llvm-branch-commits] [llvm] release/23.x: [ARM] Fix chkstk definition (#210940) (PR #212068)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Sat Jul 25 15:08:11 PDT 2026
https://github.com/llvmbot created https://github.com/llvm/llvm-project/pull/212068
Backport 77981e39b5fa26ab43a3a3611fbb247321e33d78
Requested by: @mstorsjo
>From af4e527f138bbdf7dd298b5177006e82a3c47591 Mon Sep 17 00:00:00 2001
From: Trung Nguyen <git at trungnt2910.com>
Date: Thu, 23 Jul 2026 00:56:51 +1000
Subject: [PATCH] [ARM] Fix chkstk definition (#210940)
(cherry picked from commit 77981e39b5fa26ab43a3a3611fbb247321e33d78)
---
llvm/lib/Target/ARM/ARMInstrInfo.td | 2 +-
.../ARM/Windows/chkstk-cpsr-clobber.ll | 25 +++++++++++++++++++
2 files changed, 26 insertions(+), 1 deletion(-)
create mode 100644 llvm/test/CodeGen/ARM/Windows/chkstk-cpsr-clobber.ll
diff --git a/llvm/lib/Target/ARM/ARMInstrInfo.td b/llvm/lib/Target/ARM/ARMInstrInfo.td
index 397342841a89b..4ba7a447e2edf 100644
--- a/llvm/lib/Target/ARM/ARMInstrInfo.td
+++ b/llvm/lib/Target/ARM/ARMInstrInfo.td
@@ -6041,7 +6041,7 @@ def MSRbanked : ABI<0b0001, (outs), (ins banked_reg:$banked, GPRnopc:$Rn),
def win__chkstk : SDNode<"ARMISD::WIN__CHKSTK", SDTNone,
[SDNPHasChain, SDNPSideEffect]>;
-let usesCustomInserter = 1, Uses = [R4], Defs = [R4, SP], hasNoSchedulingInfo = 1 in
+let usesCustomInserter = 1, Uses = [R4], Defs = [R4, R12, LR, SP, CPSR], hasNoSchedulingInfo = 1 in
def WIN__CHKSTK : PseudoInst<(outs), (ins), NoItinerary, [(win__chkstk)]>;
// Windows' divide by zero check
diff --git a/llvm/test/CodeGen/ARM/Windows/chkstk-cpsr-clobber.ll b/llvm/test/CodeGen/ARM/Windows/chkstk-cpsr-clobber.ll
new file mode 100644
index 0000000000000..b0be9df632557
--- /dev/null
+++ b/llvm/test/CodeGen/ARM/Windows/chkstk-cpsr-clobber.ll
@@ -0,0 +1,25 @@
+; RUN: llc -O2 -mtriple=thumbv7-windows %s -o - | FileCheck %s
+
+; Ensure that __chkstk correctly marks CPSR as clobbered so that conditional
+; operations after dynamic stack allocation re-evaluate condition flags.
+
+define arm_aapcs_vfpcc void @chkstk_cpsr_clobber(i32 %n) {
+entry:
+ %cmp = icmp sgt i32 %n, 0
+ %max = select i1 %cmp, i32 %n, i32 1
+ %vla = alloca i8, i32 %max
+ br i1 %cmp, label %then, label %exit
+
+then:
+ store volatile i8 1, ptr %vla
+ ret void
+
+exit:
+ ret void
+}
+
+; CHECK-LABEL: chkstk_cpsr_clobber:
+; CHECK: bl __chkstk
+; CHECK: sub.w sp, sp, r4
+; CHECK: cmp r0, #0
+; CHECK: it gt
More information about the llvm-branch-commits
mailing list