[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 21:06:23 PDT 2016
vivekvpandya updated this revision to Diff 61500.
vivekvpandya added a comment.
Few more changes as per reviews.
http://reviews.llvm.org/D21561
Files:
include/llvm/CodeGen/TargetPassConfig.h
lib/CodeGen/TargetFrameLoweringImpl.cpp
lib/CodeGen/TargetPassConfig.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() {
+ call void @foo()
+ ret void
+}
+
+define internal void @foo() {
+; 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}"()
+ ret void
+}
+
Index: lib/CodeGen/TargetPassConfig.cpp
===================================================================
--- lib/CodeGen/TargetPassConfig.cpp
+++ lib/CodeGen/TargetPassConfig.cpp
@@ -27,7 +27,6 @@
#include "llvm/IR/LegacyPassManager.h"
#include "llvm/IR/Verifier.h"
#include "llvm/MC/MCAsmInfo.h"
-#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
Index: lib/CodeGen/TargetFrameLoweringImpl.cpp
===================================================================
--- lib/CodeGen/TargetFrameLoweringImpl.cpp
+++ lib/CodeGen/TargetFrameLoweringImpl.cpp
@@ -12,13 +12,14 @@
//===----------------------------------------------------------------------===//
#include "llvm/ADT/BitVector.h"
-#include "llvm/Target/TargetFrameLowering.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineModuleInfo.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
+#include "llvm/CodeGen/TargetPassConfig.h"
#include "llvm/IR/CallingConv.h"
#include "llvm/IR/Function.h"
+#include "llvm/Target/TargetFrameLowering.h"
#include "llvm/Target/TargetRegisterInfo.h"
#include "llvm/Target/TargetSubtargetInfo.h"
#include <cstdlib>
@@ -59,6 +60,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/CodeGen/TargetPassConfig.h
===================================================================
--- include/llvm/CodeGen/TargetPassConfig.h
+++ include/llvm/CodeGen/TargetPassConfig.h
@@ -16,10 +16,12 @@
#include "llvm/Pass.h"
#include "llvm/Support/CodeGen.h"
+#include "llvm/Support/CommandLine.h"
#include <string>
-namespace llvm {
+extern llvm::cl::opt<bool> UseIPRA;
+namespace llvm {
class PassConfigImpl;
class ScheduleDAGInstrs;
class TargetMachine;
@@ -372,5 +374,4 @@
};
} // end namespace llvm
-
#endif
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D21561.61500.patch
Type: text/x-patch
Size: 3308 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160622/a63a12d9/attachment.bin>
More information about the llvm-commits
mailing list