From ace7ae935ffc181b79d5a22d58589949191b3416 Mon Sep 17 00:00:00 2001 From: Martin Storsjo Date: Mon, 14 May 2018 21:32:52 +0000 Subject: [PATCH] [ARM] Back up R4 and LR if calling the stack probe function Differential Revision: https://reviews.llvm.org/D46777 llvm-svn: 332298 --- llvm/lib/Target/ARM/ARMFrameLowering.cpp | 11 +++++++++++ .../test/CodeGen/ARM/Windows/chkstk-movw-movt-isel.ll | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Target/ARM/ARMFrameLowering.cpp b/llvm/lib/Target/ARM/ARMFrameLowering.cpp index 1b2c845c7b55..f350f3e8b30e 100644 --- a/llvm/lib/Target/ARM/ARMFrameLowering.cpp +++ b/llvm/lib/Target/ARM/ARMFrameLowering.cpp @@ -1620,6 +1620,17 @@ void ARMFrameLowering::determineCalleeSaves(MachineFunction &MF, (MFI.hasVarSizedObjects() || RegInfo->needsStackRealignment(MF))) SavedRegs.set(ARM::R4); + // If a stack probe will be emitted, spill R4 and LR, since they are + // clobbered by the stack probe call. + // This estimate should be a safe, conservative estimate. The actual + // stack probe is enabled based on the size of the local objects; + // this estimate also includes the varargs store size. + if (STI.isTargetWindows() && + WindowsRequiresStackProbe(MF, MFI.estimateStackSize(MF))) { + SavedRegs.set(ARM::R4); + SavedRegs.set(ARM::LR); + } + if (AFI->isThumb1OnlyFunction()) { // Spill LR if Thumb1 function uses variable length argument lists. if (AFI->getArgRegsSaveSize() > 0) diff --git a/llvm/test/CodeGen/ARM/Windows/chkstk-movw-movt-isel.ll b/llvm/test/CodeGen/ARM/Windows/chkstk-movw-movt-isel.ll index a73a7cf8414f..019298d20808 100644 --- a/llvm/test/CodeGen/ARM/Windows/chkstk-movw-movt-isel.ll +++ b/llvm/test/CodeGen/ARM/Windows/chkstk-movw-movt-isel.ll @@ -18,7 +18,7 @@ entry: } ; CHECK-LABEL: isel -; CHECK: push {r4, r5} +; CHECK: push {r4, r5, r6, lr} ; CHECK: movw r12, #0 ; CHECK: movt r12, #0 ; CHECK: movw r4, #{{\d*}}