diff options
author | Reid Kleckner <reid@kleckner.net> | 2014-02-26 19:57:30 +0000 |
---|---|---|
committer | Reid Kleckner <reid@kleckner.net> | 2014-02-26 19:57:30 +0000 |
commit | 22869378d92d38ff3c31e66c3da91c1a31f113f9 (patch) | |
tree | c58e995b2fac5185487d9d49db0e80882a8b1f4b /llvm/lib/Transforms/IPO/GlobalOpt.cpp | |
parent | 773a57958ca2aecc631f9e0ffebe4e6ec194bb5b (diff) | |
download | bcm5719-llvm-22869378d92d38ff3c31e66c3da91c1a31f113f9.tar.gz bcm5719-llvm-22869378d92d38ff3c31e66c3da91c1a31f113f9.zip |
GlobalOpt: Apply fastcc to internal x86_thiscallcc functions
We should apply fastcc whenever profitable. We can expand this list,
but there are lots of conventions with performance implications that we
don't want to change.
Differential Revision: http://llvm-reviews.chandlerc.com/D2705
llvm-svn: 202293
Diffstat (limited to 'llvm/lib/Transforms/IPO/GlobalOpt.cpp')
-rw-r--r-- | llvm/lib/Transforms/IPO/GlobalOpt.cpp | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/llvm/lib/Transforms/IPO/GlobalOpt.cpp b/llvm/lib/Transforms/IPO/GlobalOpt.cpp index 1935a7225ac..7b9015b2d7d 100644 --- a/llvm/lib/Transforms/IPO/GlobalOpt.cpp +++ b/llvm/lib/Transforms/IPO/GlobalOpt.cpp @@ -1902,6 +1902,16 @@ static void RemoveNestAttribute(Function *F) { } } +/// Return true if this is a calling convention that we'd like to change. The +/// idea here is that we don't want to mess with the convention if the user +/// explicitly requested something with performance implications like coldcc, +/// GHC, or anyregcc. +static bool isProfitableToMakeFastCC(Function *F) { + CallingConv::ID CC = F->getCallingConv(); + // FIXME: Is it worth transforming x86_stdcallcc and x86_fastcallcc? + return CC == CallingConv::C || CC == CallingConv::X86_ThisCall; +} + bool GlobalOpt::OptimizeFunctions(Module &M) { bool Changed = false; // Optimize functions. @@ -1916,11 +1926,10 @@ bool GlobalOpt::OptimizeFunctions(Module &M) { Changed = true; ++NumFnDeleted; } else if (F->hasLocalLinkage()) { - if (F->getCallingConv() == CallingConv::C && !F->isVarArg() && - !F->hasAddressTaken()) { - // If this function has C calling conventions, is not a varargs - // function, and is only called directly, promote it to use the Fast - // calling convention. + if (isProfitableToMakeFastCC(F) && !F->isVarArg() && !F->hasAddressTaken()) { + // If this function has a calling convention worth changing, is not a + // varargs function, and is only called directly, promote it to use the + // Fast calling convention. F->setCallingConv(CallingConv::Fast); ChangeCalleesToFastCall(F); ++NumFastCallFns; |