[PATCH] D21561: [IPRA] Set callee saved registers to none for local function when IPRA is enabled.

Vivek Pandya via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 21 10:46:23 PDT 2016


vivekvpandya created this revision.
vivekvpandya added reviewers: mehdi_amini, MatzeB, hfinkel, qcolombet.
vivekvpandya added a subscriber: llvm-commits.

IPRA try to optimize caller saved register by propagating register usage information from callee to caller so it is beneficial to have caller saved registers compare to callee saved registers when IPRA is enabled. Please find more detailed explanation here https://groups.google.com/d/msg/llvm-dev/XRzGhJ9wtZg/tjAJqb0eEgAJ. 
This change makes local function do not have any callee preserved register when IPRA is enabled. A simple test case is also added to verify this change.

http://reviews.llvm.org/D21561

Files:
  lib/CodeGen/TargetFrameLoweringImpl.cpp
  test/CodeGen/X86/ipra-local-linkage.ll

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
+}
Index: lib/CodeGen/TargetFrameLoweringImpl.cpp
===================================================================
--- lib/CodeGen/TargetFrameLoweringImpl.cpp
+++ lib/CodeGen/TargetFrameLoweringImpl.cpp
@@ -24,6 +24,8 @@
 #include <cstdlib>
 using namespace llvm;
 
+extern cl::opt<bool> UseIPRA;
+
 TargetFrameLowering::~TargetFrameLowering() {
 }
 
@@ -59,6 +61,13 @@
 void TargetFrameLowering::determineCalleeSaves(MachineFunction &MF,
                                                BitVector &SavedRegs,
                                                RegScavenger *RS) const {
+  Function *F = const_cast<Function *>(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);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D21561.61404.patch
Type: text/x-patch
Size: 1892 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160621/8ab465ea/attachment-0001.bin>


More information about the llvm-commits mailing list