diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2010-07-16 16:38:12 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2010-07-16 16:38:12 +0000 |
commit | e928ec9480072ed1298fba2fbd8faa0e89253bf1 (patch) | |
tree | 7b5716d9051668e7352d07d00e01192fa4054d8b /lib/Target/X86/X86TargetMachine.cpp | |
parent | 1461520f8cba8ebbdfd832d5396079888f1ab96e (diff) | |
download | llvm-e928ec9480072ed1298fba2fbd8faa0e89253bf1.tar.gz llvm-e928ec9480072ed1298fba2fbd8faa0e89253bf1.tar.bz2 llvm-e928ec9480072ed1298fba2fbd8faa0e89253bf1.tar.xz |
Allow x87 FP registers to be alive globally in a function.
FP_REG_KILL instructions are still inserted, but can be disabled by passing
-live-x87 to llc. The X87FPRegKillInserterPass is going to be removed shortly.
CFG edges are partioned into bundles where the x87 stack must be allocated
identically. Code is insertad at the end of each basic block that shuffles the
live FP registers to match the outgoing bundles expectations.
This fix is in preparation for some upcoming register allocator improvements
that may extend the live range of registers beyond a basic block, similar to
LICM. It also provides a nice runtime speedup if you are building with
-mfpmath=387.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@108529 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/X86/X86TargetMachine.cpp')
-rw-r--r-- | lib/Target/X86/X86TargetMachine.cpp | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/lib/Target/X86/X86TargetMachine.cpp b/lib/Target/X86/X86TargetMachine.cpp index df00d3ffcc..2a93a2d501 100644 --- a/lib/Target/X86/X86TargetMachine.cpp +++ b/lib/Target/X86/X86TargetMachine.cpp @@ -19,11 +19,15 @@ #include "llvm/CodeGen/Passes.h" #include "llvm/MC/MCCodeEmitter.h" #include "llvm/MC/MCStreamer.h" +#include "llvm/Support/CommandLine.h" #include "llvm/Support/FormattedStream.h" #include "llvm/Target/TargetOptions.h" #include "llvm/Target/TargetRegistry.h" using namespace llvm; +static cl::opt<bool> +LiveX87("live-x87", cl::desc("Allow live X87 registers across blocks")); + static MCAsmInfo *createMCAsmInfo(const Target &T, StringRef TT) { Triple TheTriple(TT); switch (TheTriple.getOS()) { @@ -183,7 +187,8 @@ bool X86TargetMachine::addInstSelector(PassManagerBase &PM, bool X86TargetMachine::addPreRegAlloc(PassManagerBase &PM, CodeGenOpt::Level OptLevel) { // Install a pass to insert x87 FP_REG_KILL instructions, as needed. - PM.add(createX87FPRegKillInserterPass()); + if (!LiveX87) + PM.add(createX87FPRegKillInserterPass()); PM.add(createX86MaxStackAlignmentHeuristicPass()); return false; // -print-machineinstr shouldn't print after this. |