From 2265cf485eb26b9ccc346b0bf351b81004d9d8b7 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Wed, 29 Oct 2008 01:02:02 +0000 Subject: [PATCH] Factor shouldInline method out of Inliner. - No functionality change. llvm-svn: 58355 --- include/llvm/Transforms/IPO/InlinerPass.h | 6 +++- lib/Transforms/IPO/Inliner.cpp | 44 +++++++++++++---------- 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/include/llvm/Transforms/IPO/InlinerPass.h b/include/llvm/Transforms/IPO/InlinerPass.h index e0a3d2943e5..00950f78e8c 100644 --- a/include/llvm/Transforms/IPO/InlinerPass.h +++ b/include/llvm/Transforms/IPO/InlinerPass.h @@ -23,7 +23,7 @@ namespace llvm { class CallSite; /// Inliner - This class contains all of the helper code which is used to -/// perform the inlining operations that does not depend on the policy. +/// perform the inlining operations that do not depend on the policy. /// struct Inliner : public CallGraphSCCPass { explicit Inliner(void *ID); @@ -63,6 +63,10 @@ struct Inliner : public CallGraphSCCPass { private: // InlineThreshold - Cache the value here for easy access. unsigned InlineThreshold; + + /// shouldInline - Return true if the inliner should attempt to + /// inline at the given CallSite. + bool shouldInline(CallSite CS); }; } // End llvm namespace diff --git a/lib/Transforms/IPO/Inliner.cpp b/lib/Transforms/IPO/Inliner.cpp index c2672720040..74af18396d4 100644 --- a/lib/Transforms/IPO/Inliner.cpp +++ b/lib/Transforms/IPO/Inliner.cpp @@ -72,6 +72,31 @@ static bool InlineCallIfPossible(CallSite CS, CallGraph &CG, } return true; } + +/// shouldInline - Return true if the inliner should attempt to inline +/// at the given CallSite. +bool Inliner::shouldInline(CallSite CS) { + int Cost = getInlineCost(CS); + float FudgeFactor = getInlineFudgeFactor(CS); + + int CurrentThreshold = InlineThreshold; + Function *Fn = CS.getCaller(); + if (Fn && !Fn->isDeclaration() + && Fn->hasFnAttr(Attribute::OptimizeForSize) + && InlineThreshold != 50) { + CurrentThreshold = 50; + } + + if (Cost >= (int)(CurrentThreshold * FudgeFactor)) { + DOUT << " NOT Inlining: cost=" << Cost + << ", Call: " << *CS.getInstruction(); + return false; + } else { + DOUT << " Inlining: cost=" << Cost + << ", Call: " << *CS.getInstruction(); + return true; + } +} bool Inliner::runOnSCC(const std::vector &SCC) { CallGraph &CG = getAnalysis(); @@ -136,24 +161,7 @@ bool Inliner::runOnSCC(const std::vector &SCC) { // If the policy determines that we should inline this function, // try to do so. CallSite CS = CallSites[CSi]; - int InlineCost = getInlineCost(CS); - float FudgeFactor = getInlineFudgeFactor(CS); - - int CurrentThreshold = InlineThreshold; - Function *Fn = CS.getCaller(); - if (Fn && !Fn->isDeclaration() - && Fn->hasFnAttr(Attribute::OptimizeForSize) - && InlineThreshold != 50) { - CurrentThreshold = 50; - } - - if (InlineCost >= (int)(CurrentThreshold * FudgeFactor)) { - DOUT << " NOT Inlining: cost=" << InlineCost - << ", Call: " << *CS.getInstruction(); - } else { - DOUT << " Inlining: cost=" << InlineCost - << ", Call: " << *CS.getInstruction(); - + if (shouldInline(CS)) { // Attempt to inline the function... if (InlineCallIfPossible(CS, CG, SCCFunctions, getAnalysis())) {