Index: lib/CodeGen/TargetFrameLoweringImpl.cpp =================================================================== --- lib/CodeGen/TargetFrameLoweringImpl.cpp +++ lib/CodeGen/TargetFrameLoweringImpl.cpp @@ -24,6 +24,8 @@ #include using namespace llvm; +extern cl::opt UseIPRA; + TargetFrameLowering::~TargetFrameLowering() { } @@ -59,6 +61,13 @@ void TargetFrameLowering::determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs, RegScavenger *RS) const { + Function *F = const_cast(MF.getFunction()); + + // When interprocedural register allocation is enabled caller saved registers + // are preferred over callee saved registers. + if (UseIPRA && F->hasLocalLinkage() && !F->hasAddressTaken()) + return; + // Get the callee saved register list... const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo(); const MCPhysReg *CSRegs = TRI.getCalleeSavedRegs(&MF); Index: test/CodeGen/X86/ipra-local-linkage.ll =================================================================== --- /dev/null +++ test/CodeGen/X86/ipra-local-linkage.ll @@ -0,0 +1,22 @@ +; RUN: llc < %s | FileCheck %s -check-prefix=NOIPRA +; RUN: llc -enable-ipra < %s | FileCheck %s + +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.12.0" + +define void @bar() #0 { + call void @foo() + ret void +} + +define internal void @foo() #0 { +; When IPRA is not enabled R15 will be saved by foo as it is callee saved reg. +; NOIPRA-LABEL: foo: +; NOIPRA: pushq %r15 +; When IPRA is enabled none register should be saved as foo() is local function +; so we optimize it to save no registers. +; CHECK: foo: +; CHECK-NOT: pushq %r15 + call void asm sideeffect "", "~{eax},~{ecx},~{edi},~{r15}"() #0 + ret void +}