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 | 726bae9a6616a8395a79f4346c17aaab6886eb1a (patch) | |
tree | d1c90e4bbdebd7606cb8253caf713d5bd51e71b8 /lib | |
parent | 0a91f4830848ca16bf4b0569e45e23d7e8043368 (diff) | |
download | llvm-726bae9a6616a8395a79f4346c17aaab6886eb1a.tar.gz llvm-726bae9a6616a8395a79f4346c17aaab6886eb1a.tar.bz2 llvm-726bae9a6616a8395a79f4346c17aaab6886eb1a.tar.xz |
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
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@202293 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Transforms/IPO/GlobalOpt.cpp | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/lib/Transforms/IPO/GlobalOpt.cpp b/lib/Transforms/IPO/GlobalOpt.cpp index 1935a7225a..7b9015b2d7 100644 --- a/lib/Transforms/IPO/GlobalOpt.cpp +++ b/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; |