From: Sander de Smalen Date: Thu, 1 Aug 2019 10:53:45 +0000 (+0000) Subject: [AArch64] Do not allocate unnecessary emergency slot. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3844c8102f04ab909deaf5c74f43ad2f5e8e01eb;p=llvm [AArch64] Do not allocate unnecessary emergency slot. Fix an issue where the compiler still allocates an emergency spill slot even though it already decided to spill an extra callee-save register to use as a scratch register. Reviewers: gberry, thegameg, mstorsjo, t.p.northover Reviewed By: thegameg Differential Revision: https://reviews.llvm.org/D65504 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@367540 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/AArch64/AArch64FrameLowering.cpp b/lib/Target/AArch64/AArch64FrameLowering.cpp index 8c6e5cbd5c1..b5ec5a2fa54 100644 --- a/lib/Target/AArch64/AArch64FrameLowering.cpp +++ b/lib/Target/AArch64/AArch64FrameLowering.cpp @@ -2113,7 +2113,7 @@ void AArch64FrameLowering::determineCalleeSaves(MachineFunction &MF, SavedRegs.set(AArch64::LR); } - LLVM_DEBUG(dbgs() << "*** determineCalleeSaves\nUsed CSRs:"; + LLVM_DEBUG(dbgs() << "*** determineCalleeSaves\nSaved CSRs:"; for (unsigned Reg : SavedRegs.set_bits()) dbgs() << ' ' << printReg(Reg, RegInfo); @@ -2145,7 +2145,7 @@ void AArch64FrameLowering::determineCalleeSaves(MachineFunction &MF, // store the pair. if (produceCompactUnwindFrame(MF)) SavedRegs.set(UnspilledCSGPRPaired); - ExtraCSSpill = UnspilledCSGPRPaired; + ExtraCSSpill = UnspilledCSGPR; } // If we didn't find an extra callee-saved register to spill, create diff --git a/test/CodeGen/AArch64/extra-callee-save.mir b/test/CodeGen/AArch64/extra-callee-save.mir new file mode 100644 index 00000000000..f03dec05938 --- /dev/null +++ b/test/CodeGen/AArch64/extra-callee-save.mir @@ -0,0 +1,28 @@ +#RUN: llc -mtriple=aarch64-- -run-pass prologepilog %s -o - | FileCheck %s +# Check that we spill a scratch register, but not also an additional +# emergency spill slot. +--- +name: big_stack +# CHECK-LABEL: name: big_stack +# CHECK: frame-setup STPXi killed $x20, killed $x19 +# CHECK: $sp = frame-setup SUBXri $sp, 8, 12 +# CHECK-NOT: frame-setup SUBXri $sp, 16, 0 +tracksRegLiveness: true +stack: + - { id: 0, name: '', size: 32761, alignment: 8 } +body: | + bb.0: + $x19 = IMPLICIT_DEF + ; $x20 can be used as scratch register. + $x21 = IMPLICIT_DEF + $x22 = IMPLICIT_DEF + $x23 = IMPLICIT_DEF + $x24 = IMPLICIT_DEF + $x25 = IMPLICIT_DEF + $x26 = IMPLICIT_DEF + $x27 = IMPLICIT_DEF + $x28 = IMPLICIT_DEF + $lr = IMPLICIT_DEF + $fp = IMPLICIT_DEF + RET_ReallyLR +...