X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTransforms%2FUtils%2FInlineCost.cpp;h=6ecd060991238c9f46ff137f400a09ef0db616aa;hb=dd4924c564c7a661b78b604ebf16dfef7aa62b35;hp=ab459c2e3f923e42cd4e6c6935809fc57f1da4bb;hpb=161660e6d282515252866a0a12642211cf5639be;p=oota-llvm.git diff --git a/lib/Transforms/Utils/InlineCost.cpp b/lib/Transforms/Utils/InlineCost.cpp index ab459c2e3f9..6ecd0609912 100644 --- a/lib/Transforms/Utils/InlineCost.cpp +++ b/lib/Transforms/Utils/InlineCost.cpp @@ -2,8 +2,8 @@ // // The LLVM Compiler Infrastructure // -// This file was developed by the LLVM research group and is distributed under -// the University of Illinois Open Source License. See LICENSE.TXT for details. +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // @@ -93,14 +93,41 @@ unsigned InlineCostAnalyzer::FunctionInfo:: /// analyzeFunction - Fill in the current structure with information gleaned /// from the specified function. void InlineCostAnalyzer::FunctionInfo::analyzeFunction(Function *F) { - unsigned NumInsts = 0, NumBlocks = 0; + unsigned NumInsts = 0, NumBlocks = 0, NumVectorInsts = 0; // Look at the size of the callee. Each basic block counts as 20 units, and // each instruction counts as 5. for (Function::const_iterator BB = F->begin(), E = F->end(); BB != E; ++BB) { for (BasicBlock::const_iterator II = BB->begin(), E = BB->end(); II != E; ++II) { - if (isa(II)) continue; // Debug intrinsics don't count. + if (isa(II)) continue; // PHI nodes don't count. + + // Special handling for calls. + if (isa(II) || isa(II)) { + if (isa(II)) + continue; // Debug intrinsics don't count as size. + + CallSite CS = CallSite::get(const_cast(&*II)); + + // If this function contains a call to setjmp or _setjmp, never inline + // it. This is a hack because we depend on the user marking their local + // variables as volatile if they are live across a setjmp call, and they + // probably won't do this in callers. + if (Function *F = CS.getCalledFunction()) + if (F->isDeclaration() && + (F->isName("setjmp") || F->isName("_setjmp"))) { + NeverInline = true; + return; + } + + // Calls often compile into many machine instructions. Bump up their + // cost to reflect this. + if (!isa(II)) + NumInsts += 5; + } + + if (isa(II) || isa(II->getType())) + ++NumVectorInsts; // Noop casts, including ptr <-> int, don't count. if (const CastInst *CI = dyn_cast(II)) { @@ -108,7 +135,7 @@ void InlineCostAnalyzer::FunctionInfo::analyzeFunction(Function *F) { isa(CI)) continue; } else if (const GetElementPtrInst *GEPI = - dyn_cast(II)) { + dyn_cast(II)) { // If a GEP has all constant indices, it will probably be folded with // a load/store. bool AllConstant = true; @@ -126,8 +153,9 @@ void InlineCostAnalyzer::FunctionInfo::analyzeFunction(Function *F) { ++NumBlocks; } - this->NumBlocks = NumBlocks; - this->NumInsts = NumInsts; + this->NumBlocks = NumBlocks; + this->NumInsts = NumInsts; + this->NumVectorInsts = NumVectorInsts; // Check out all of the arguments to the function, figuring out how much // code can be eliminated if one of the arguments is a constant. @@ -141,7 +169,8 @@ void InlineCostAnalyzer::FunctionInfo::analyzeFunction(Function *F) { // getInlineCost - The heuristic used to determine if we should inline the // function call or not. // -int InlineCostAnalyzer::getInlineCost(CallSite CS, SmallPtrSet &NeverInline) { +int InlineCostAnalyzer::getInlineCost(CallSite CS, + SmallPtrSet &NeverInline) { Instruction *TheCall = CS.getInstruction(); Function *Callee = CS.getCalledFunction(); const Function *Caller = TheCall->getParent()->getParent(); @@ -166,7 +195,7 @@ int InlineCostAnalyzer::getInlineCost(CallSite CS, SmallPtrSethasInternalLinkage() && Callee->hasOneUse()) - InlineCost -= 30000; + InlineCost -= 15000; // If this function uses the coldcc calling convention, prefer not to inline // it. @@ -188,6 +217,13 @@ int InlineCostAnalyzer::getInlineCost(CallSite CS, SmallPtrSetisDeclaration() && Callee->hasNote(FN_NOTE_AlwaysInline)) + return -2000000000; // Add to the inline quality for properties that make the call valuable to // inline. This includes factors that indicate that the result of inlining @@ -227,15 +263,38 @@ int InlineCostAnalyzer::getInlineCost(CallSite CS, SmallPtrSetsize()/20; - + InlineCost += Caller->size()/15; - // Look at the size of the callee. Each basic block counts as 20 units, and - // each instruction counts as 5. - InlineCost += CalleeFI.NumInsts*5 + CalleeFI.NumBlocks*20; + // Look at the size of the callee. Each instruction counts as 5. + InlineCost += CalleeFI.NumInsts*5; + return InlineCost; } +// getInlineFudgeFactor - Return a > 1.0 factor if the inliner should use a +// higher threshold to determine if the function call should be inlined. +float InlineCostAnalyzer::getInlineFudgeFactor(CallSite CS) { + Function *Callee = CS.getCalledFunction(); + + // Get information about the callee... + FunctionInfo &CalleeFI = CachedFunctionInfo[Callee]; + + // If we haven't calculated this information yet, do so now. + if (CalleeFI.NumBlocks == 0) + CalleeFI.analyzeFunction(Callee); + + float Factor = 1.0f; + // Single BB functions are often written to be inlined. + if (CalleeFI.NumBlocks == 1) + Factor += 0.5f; + + // Be more aggressive if the function contains a good chunk (if it mades up + // at least 10% of the instructions) of vector instructions. + if (CalleeFI.NumVectorInsts > CalleeFI.NumInsts/2) + Factor += 2.0f; + else if (CalleeFI.NumVectorInsts > CalleeFI.NumInsts/10) + Factor += 1.5f; + return Factor; +}