diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2012-01-18 23:52:22 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2012-01-18 23:52:22 +0000 |
commit | c38c4561cd1c8ee305122205daff2a6324900127 (patch) | |
tree | b83cbac0bb85559858c79ff7250e2225fd72ba8b | |
parent | 71f0fc1ca88965b69b4b2c8794a7144bc93d4bba (diff) |
Add experimental -x86-use-regmask command line option.
It adds register mask operands to x86 call instructions. Once all the
backend passes support register mask operands, this will be permanently
enabled.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@148438 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/X86/X86ISelLowering.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index ab5a8de92b..91dc7b51d8 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -45,6 +45,7 @@ #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/VariadicFunction.h" #include "llvm/Support/CallSite.h" +#include "llvm/Support/CommandLine.h" #include "llvm/Support/Debug.h" #include "llvm/Support/Dwarf.h" #include "llvm/Support/ErrorHandling.h" @@ -56,6 +57,9 @@ using namespace dwarf; STATISTIC(NumTailCalls, "Number of tail calls"); +static cl::opt<bool> UseRegMask("x86-use-regmask", + cl::desc("Use register masks for x86 calls")); + // Forward declarations. static SDValue getMOVL(SelectionDAG &DAG, DebugLoc dl, EVT VT, SDValue V1, SDValue V2); @@ -2506,6 +2510,14 @@ X86TargetLowering::LowerCall(SDValue Chain, SDValue Callee, if (Is64Bit && isVarArg && !IsWin64) Ops.push_back(DAG.getRegister(X86::AL, MVT::i8)); + // Experimental: Add a register mask operand representing the call-preserved + // registers. + if (UseRegMask) { + const TargetRegisterInfo *TRI = getTargetMachine().getRegisterInfo(); + const uint32_t *Mask = TRI->getCallPreservedMask(CallConv); + Ops.push_back(DAG.getRegisterMask(Mask)); + } + if (InFlag.getNode()) Ops.push_back(InFlag); |