Increasing the inline limit from (overly conservative) 200 to 300. Given each BB costs 20 and each instruction costs 5, 200 means a 4 BB function + 24 instructions (actually less because caller's size also contributes to it).

Furthermore, double the limit when more than 10% of the callee instructions are vector instructions. Multimedia kernels tend to love inlining.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48725 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Evan Cheng
2008-03-24 06:37:48 +00:00
parent 16b412c6e2
commit 8d84d5b62c
5 changed files with 54 additions and 11 deletions

View File

@@ -55,6 +55,11 @@ struct Inliner : public CallGraphSCCPass {
///
virtual int getInlineCost(CallSite CS) = 0;
// getInlineFudgeFactor - Return a > 1.0 factor if the inliner should use a
// higher threshold to determine if the function call should be inlined.
///
virtual float getInlineFudgeFactor(CallSite CS) = 0;
private:
// InlineThreshold - Cache the value here for easy access.
unsigned InlineThreshold;

View File

@@ -41,6 +41,10 @@ namespace llvm {
// NumInsts, NumBlocks - Keep track of how large each function is, which is
// used to estimate the code size cost of inlining it.
unsigned NumInsts, NumBlocks;
// NumVectorInsts - Keep track how many instrctions produce vector values.
// The inliner is being more aggressive with inlining vector kernels.
unsigned NumVectorInsts;
// ArgumentWeights - Each formal argument of the function is inspected to
// see if it is used in any contexts where making it a constant or alloca
@@ -48,7 +52,7 @@ namespace llvm {
// entry here.
std::vector<ArgInfo> ArgumentWeights;
FunctionInfo() : NumInsts(0), NumBlocks(0) {}
FunctionInfo() : NumInsts(0), NumBlocks(0), NumVectorInsts(0) {}
/// analyzeFunction - Fill in the current structure with information gleaned
/// from the specified function.
@@ -73,7 +77,12 @@ namespace llvm {
// getInlineCost - The heuristic used to determine if we should inline the
// function call or not.
//
int getInlineCost(CallSite CS, SmallPtrSet<const Function *, 16> &NeverInline);
int getInlineCost(CallSite CS,
SmallPtrSet<const Function *, 16> &NeverInline);
// getInlineFudgeFactor - Return a > 1.0 factor if the inliner should use a
// higher threshold to determine if the function call should be inlined.
float getInlineFudgeFactor(CallSite CS);
};
}