[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 12:37:24 PDT 2016


vivekvpandya updated this revision to Diff 61426.
vivekvpandya added a comment.

Changes as per reviews.


http://reviews.llvm.org/D21561

Files:
  include/llvm/Target/TargetFrameLowering.h
  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 triple = "x86_64--"
+
+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
+}
+attributes #0 = {nounwind}
Index: lib/CodeGen/TargetFrameLoweringImpl.cpp
===================================================================
--- lib/CodeGen/TargetFrameLoweringImpl.cpp
+++ lib/CodeGen/TargetFrameLoweringImpl.cpp
@@ -59,6 +59,14 @@
 void TargetFrameLowering::determineCalleeSaves(MachineFunction &MF,
                                                BitVector &SavedRegs,
                                                RegScavenger *RS) const {
+  // When interprocedural register allocation is enabled caller saved registers
+  // are preferred over callee saved registers.
+  if (UseIPRA) {
+    Function *F = const_cast<Function *>(MF.getFunction());
+    if (F->hasLocalLinkage() && !F->hasAddressTaken())
+      return;
+  }
+
   // Get the callee saved register list...
   const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
   const MCPhysReg *CSRegs = TRI.getCalleeSavedRegs(&MF);
Index: include/llvm/Target/TargetFrameLowering.h
===================================================================
--- include/llvm/Target/TargetFrameLowering.h
+++ include/llvm/Target/TargetFrameLowering.h
@@ -18,6 +18,8 @@
 #include <utility>
 #include <vector>
 
+extern llvm::cl::opt<bool> UseIPRA;
+
 namespace llvm {
   class BitVector;
   class CalleeSavedInfo;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D21561.61426.patch
Type: text/x-patch
Size: 2080 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160621/21bcdb11/attachment.bin>


More information about the llvm-commits mailing list