| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 1 | //===- InlineCost.cpp - Cost analysis for inliner -------------------------===// | 
 | 2 | // | 
 | 3 | //                     The LLVM Compiler Infrastructure | 
 | 4 | // | 
 | 5 | // This file is distributed under the University of Illinois Open Source | 
 | 6 | // License. See LICENSE.TXT for details. | 
 | 7 | // | 
 | 8 | //===----------------------------------------------------------------------===// | 
 | 9 | // | 
 | 10 | // This file implements inline cost analysis. | 
 | 11 | // | 
 | 12 | //===----------------------------------------------------------------------===// | 
 | 13 |  | 
 | 14 | #include "llvm/Analysis/InlineCost.h" | 
 | 15 | #include "llvm/Support/CallSite.h" | 
 | 16 | #include "llvm/CallingConv.h" | 
 | 17 | #include "llvm/IntrinsicInst.h" | 
 | 18 | #include "llvm/ADT/SmallPtrSet.h" | 
 | 19 | using namespace llvm; | 
 | 20 |  | 
 | 21 | // CountCodeReductionForConstant - Figure out an approximation for how many | 
 | 22 | // instructions will be constant folded if the specified value is constant. | 
 | 23 | // | 
| Dan Gohman | e7f0ed5 | 2009-10-13 19:58:07 +0000 | [diff] [blame] | 24 | unsigned InlineCostAnalyzer::FunctionInfo:: | 
| Devang Patel | f96769b | 2010-03-13 00:45:31 +0000 | [diff] [blame] | 25 | CountCodeReductionForConstant(Value *V) { | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 26 |   unsigned Reduction = 0; | 
 | 27 |   for (Value::use_iterator UI = V->use_begin(), E = V->use_end(); UI != E; ++UI) | 
| Jakob Stoklund Olesen | 43cda02 | 2010-01-26 23:21:56 +0000 | [diff] [blame] | 28 |     if (isa<BranchInst>(*UI) || isa<SwitchInst>(*UI)) { | 
 | 29 |       // We will be able to eliminate all but one of the successors. | 
 | 30 |       const TerminatorInst &TI = cast<TerminatorInst>(**UI); | 
 | 31 |       const unsigned NumSucc = TI.getNumSuccessors(); | 
 | 32 |       unsigned Instrs = 0; | 
 | 33 |       for (unsigned I = 0; I != NumSucc; ++I) | 
| Devang Patel | cbd0560 | 2010-03-13 00:10:20 +0000 | [diff] [blame] | 34 |         Instrs += Metrics.NumBBInsts[TI.getSuccessor(I)]; | 
| Jakob Stoklund Olesen | 43cda02 | 2010-01-26 23:21:56 +0000 | [diff] [blame] | 35 |       // We don't know which blocks will be eliminated, so use the average size. | 
 | 36 |       Reduction += InlineConstants::InstrCost*Instrs*(NumSucc-1)/NumSucc; | 
 | 37 |     } else if (CallInst *CI = dyn_cast<CallInst>(*UI)) { | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 38 |       // Turning an indirect call into a direct call is a BIG win | 
| Jakob Stoklund Olesen | 43cda02 | 2010-01-26 23:21:56 +0000 | [diff] [blame] | 39 |       if (CI->getCalledValue() == V) | 
 | 40 |         Reduction += InlineConstants::IndirectCallBonus; | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 41 |     } else if (InvokeInst *II = dyn_cast<InvokeInst>(*UI)) { | 
 | 42 |       // Turning an indirect call into a direct call is a BIG win | 
| Jakob Stoklund Olesen | 43cda02 | 2010-01-26 23:21:56 +0000 | [diff] [blame] | 43 |       if (II->getCalledValue() == V) | 
 | 44 |         Reduction += InlineConstants::IndirectCallBonus; | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 45 |     } else { | 
 | 46 |       // Figure out if this instruction will be removed due to simple constant | 
 | 47 |       // propagation. | 
 | 48 |       Instruction &Inst = cast<Instruction>(**UI); | 
| Jakob Stoklund Olesen | 43cda02 | 2010-01-26 23:21:56 +0000 | [diff] [blame] | 49 |  | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 50 |       // We can't constant propagate instructions which have effects or | 
 | 51 |       // read memory. | 
 | 52 |       // | 
 | 53 |       // FIXME: It would be nice to capture the fact that a load from a | 
 | 54 |       // pointer-to-constant-global is actually a *really* good thing to zap. | 
 | 55 |       // Unfortunately, we don't know the pointer that may get propagated here, | 
 | 56 |       // so we can't make this decision. | 
 | 57 |       if (Inst.mayReadFromMemory() || Inst.mayHaveSideEffects() || | 
| Jakob Stoklund Olesen | 43cda02 | 2010-01-26 23:21:56 +0000 | [diff] [blame] | 58 |           isa<AllocaInst>(Inst)) | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 59 |         continue; | 
 | 60 |  | 
 | 61 |       bool AllOperandsConstant = true; | 
 | 62 |       for (unsigned i = 0, e = Inst.getNumOperands(); i != e; ++i) | 
 | 63 |         if (!isa<Constant>(Inst.getOperand(i)) && Inst.getOperand(i) != V) { | 
 | 64 |           AllOperandsConstant = false; | 
 | 65 |           break; | 
 | 66 |         } | 
 | 67 |  | 
 | 68 |       if (AllOperandsConstant) { | 
 | 69 |         // We will get to remove this instruction... | 
| Jakob Stoklund Olesen | 43cda02 | 2010-01-26 23:21:56 +0000 | [diff] [blame] | 70 |         Reduction += InlineConstants::InstrCost; | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 71 |  | 
 | 72 |         // And any other instructions that use it which become constants | 
 | 73 |         // themselves. | 
| Devang Patel | f96769b | 2010-03-13 00:45:31 +0000 | [diff] [blame] | 74 |         Reduction += CountCodeReductionForConstant(&Inst); | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 75 |       } | 
 | 76 |     } | 
 | 77 |  | 
 | 78 |   return Reduction; | 
 | 79 | } | 
 | 80 |  | 
 | 81 | // CountCodeReductionForAlloca - Figure out an approximation of how much smaller | 
 | 82 | // the function will be if it is inlined into a context where an argument | 
 | 83 | // becomes an alloca. | 
 | 84 | // | 
| Dan Gohman | e7f0ed5 | 2009-10-13 19:58:07 +0000 | [diff] [blame] | 85 | unsigned InlineCostAnalyzer::FunctionInfo:: | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 86 |          CountCodeReductionForAlloca(Value *V) { | 
| Duncan Sands | 1df9859 | 2010-02-16 11:11:14 +0000 | [diff] [blame] | 87 |   if (!V->getType()->isPointerTy()) return 0;  // Not a pointer | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 88 |   unsigned Reduction = 0; | 
 | 89 |   for (Value::use_iterator UI = V->use_begin(), E = V->use_end(); UI != E;++UI){ | 
 | 90 |     Instruction *I = cast<Instruction>(*UI); | 
 | 91 |     if (isa<LoadInst>(I) || isa<StoreInst>(I)) | 
| Jakob Stoklund Olesen | 43cda02 | 2010-01-26 23:21:56 +0000 | [diff] [blame] | 92 |       Reduction += InlineConstants::InstrCost; | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 93 |     else if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(I)) { | 
 | 94 |       // If the GEP has variable indices, we won't be able to do much with it. | 
| Jakob Stoklund Olesen | 026ac3a | 2010-01-26 21:31:35 +0000 | [diff] [blame] | 95 |       if (GEP->hasAllConstantIndices()) | 
 | 96 |         Reduction += CountCodeReductionForAlloca(GEP); | 
| Jakob Stoklund Olesen | 43cda02 | 2010-01-26 23:21:56 +0000 | [diff] [blame] | 97 |     } else if (BitCastInst *BCI = dyn_cast<BitCastInst>(I)) { | 
 | 98 |       // Track pointer through bitcasts. | 
 | 99 |       Reduction += CountCodeReductionForAlloca(BCI); | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 100 |     } else { | 
 | 101 |       // If there is some other strange instruction, we're not going to be able | 
 | 102 |       // to do much if we inline this. | 
 | 103 |       return 0; | 
 | 104 |     } | 
 | 105 |   } | 
 | 106 |  | 
 | 107 |   return Reduction; | 
 | 108 | } | 
 | 109 |  | 
| Eric Christopher | 745d8c9 | 2010-01-14 21:48:00 +0000 | [diff] [blame] | 110 | // callIsSmall - If a call is likely to lower to a single target instruction, or | 
| Eric Christopher | 2d59ae6 | 2010-01-14 20:12:34 +0000 | [diff] [blame] | 111 | // is otherwise deemed small return true. | 
 | 112 | // TODO: Perhaps calls like memcpy, strcpy, etc? | 
 | 113 | static bool callIsSmall(const Function *F) { | 
| Eric Christopher | 745d8c9 | 2010-01-14 21:48:00 +0000 | [diff] [blame] | 114 |   if (!F) return false; | 
 | 115 |    | 
 | 116 |   if (F->hasLocalLinkage()) return false; | 
 | 117 |    | 
| Eric Christopher | 83c20d3 | 2010-01-14 23:00:10 +0000 | [diff] [blame] | 118 |   if (!F->hasName()) return false; | 
 | 119 |    | 
 | 120 |   StringRef Name = F->getName(); | 
 | 121 |    | 
 | 122 |   // These will all likely lower to a single selection DAG node. | 
 | 123 |   if (Name == "copysign" || Name == "copysignf" || | 
 | 124 |       Name == "fabs" || Name == "fabsf" || Name == "fabsl" || | 
 | 125 |       Name == "sin" || Name == "sinf" || Name == "sinl" || | 
 | 126 |       Name == "cos" || Name == "cosf" || Name == "cosl" || | 
 | 127 |       Name == "sqrt" || Name == "sqrtf" || Name == "sqrtl" ) | 
 | 128 |     return true; | 
 | 129 |    | 
 | 130 |   // These are all likely to be optimized into something smaller. | 
 | 131 |   if (Name == "pow" || Name == "powf" || Name == "powl" || | 
 | 132 |       Name == "exp2" || Name == "exp2l" || Name == "exp2f" || | 
 | 133 |       Name == "floor" || Name == "floorf" || Name == "ceil" || | 
 | 134 |       Name == "round" || Name == "ffs" || Name == "ffsl" || | 
 | 135 |       Name == "abs" || Name == "labs" || Name == "llabs") | 
 | 136 |     return true; | 
 | 137 |    | 
| Eric Christopher | 2d59ae6 | 2010-01-14 20:12:34 +0000 | [diff] [blame] | 138 |   return false; | 
 | 139 | } | 
 | 140 |  | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 141 | /// analyzeBasicBlock - Fill in the current structure with information gleaned | 
 | 142 | /// from the specified block. | 
| Dan Gohman | e7f0ed5 | 2009-10-13 19:58:07 +0000 | [diff] [blame] | 143 | void CodeMetrics::analyzeBasicBlock(const BasicBlock *BB) { | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 144 |   ++NumBlocks; | 
| Devang Patel | afc33fa | 2010-03-13 01:05:02 +0000 | [diff] [blame^] | 145 |   unsigned NumInstsBeforeThisBB = NumInsts; | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 146 |   for (BasicBlock::const_iterator II = BB->begin(), E = BB->end(); | 
 | 147 |        II != E; ++II) { | 
 | 148 |     if (isa<PHINode>(II)) continue;           // PHI nodes don't count. | 
 | 149 |  | 
 | 150 |     // Special handling for calls. | 
 | 151 |     if (isa<CallInst>(II) || isa<InvokeInst>(II)) { | 
 | 152 |       if (isa<DbgInfoIntrinsic>(II)) | 
 | 153 |         continue;  // Debug intrinsics don't count as size. | 
 | 154 |        | 
 | 155 |       CallSite CS = CallSite::get(const_cast<Instruction*>(&*II)); | 
 | 156 |        | 
 | 157 |       // If this function contains a call to setjmp or _setjmp, never inline | 
 | 158 |       // it.  This is a hack because we depend on the user marking their local | 
 | 159 |       // variables as volatile if they are live across a setjmp call, and they | 
 | 160 |       // probably won't do this in callers. | 
 | 161 |       if (Function *F = CS.getCalledFunction()) | 
 | 162 |         if (F->isDeclaration() &&  | 
| Dan Gohman | 497f619 | 2009-10-13 20:10:10 +0000 | [diff] [blame] | 163 |             (F->getName() == "setjmp" || F->getName() == "_setjmp")) | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 164 |           NeverInline = true; | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 165 |  | 
| Jakob Stoklund Olesen | aa034fa | 2010-02-05 23:21:18 +0000 | [diff] [blame] | 166 |       if (!isa<IntrinsicInst>(II) && !callIsSmall(CS.getCalledFunction())) { | 
 | 167 |         // Each argument to a call takes on average one instruction to set up. | 
 | 168 |         NumInsts += CS.arg_size(); | 
 | 169 |         ++NumCalls; | 
 | 170 |       } | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 171 |     } | 
 | 172 |      | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 173 |     if (const AllocaInst *AI = dyn_cast<AllocaInst>(II)) { | 
 | 174 |       if (!AI->isStaticAlloca()) | 
 | 175 |         this->usesDynamicAlloca = true; | 
 | 176 |     } | 
 | 177 |  | 
| Duncan Sands | 1df9859 | 2010-02-16 11:11:14 +0000 | [diff] [blame] | 178 |     if (isa<ExtractElementInst>(II) || II->getType()->isVectorTy()) | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 179 |       ++NumVectorInsts;  | 
 | 180 |      | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 181 |     if (const CastInst *CI = dyn_cast<CastInst>(II)) { | 
| Evan Cheng | 1a67dd2 | 2010-01-14 21:04:31 +0000 | [diff] [blame] | 182 |       // Noop casts, including ptr <-> int,  don't count. | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 183 |       if (CI->isLosslessCast() || isa<IntToPtrInst>(CI) ||  | 
 | 184 |           isa<PtrToIntInst>(CI)) | 
 | 185 |         continue; | 
| Evan Cheng | 1a67dd2 | 2010-01-14 21:04:31 +0000 | [diff] [blame] | 186 |       // Result of a cmp instruction is often extended (to be used by other | 
 | 187 |       // cmp instructions, logical or return instructions). These are usually | 
 | 188 |       // nop on most sane targets. | 
 | 189 |       if (isa<CmpInst>(CI->getOperand(0))) | 
 | 190 |         continue; | 
| Chris Lattner | b93a23a | 2009-11-01 03:07:53 +0000 | [diff] [blame] | 191 |     } else if (const GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(II)){ | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 192 |       // If a GEP has all constant indices, it will probably be folded with | 
 | 193 |       // a load/store. | 
 | 194 |       if (GEPI->hasAllConstantIndices()) | 
 | 195 |         continue; | 
 | 196 |     } | 
 | 197 |  | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 198 |     ++NumInsts; | 
 | 199 |   } | 
| Chris Lattner | b93a23a | 2009-11-01 03:07:53 +0000 | [diff] [blame] | 200 |    | 
 | 201 |   if (isa<ReturnInst>(BB->getTerminator())) | 
 | 202 |     ++NumRets; | 
 | 203 |    | 
| Chris Lattner | 6658870 | 2009-11-01 18:16:30 +0000 | [diff] [blame] | 204 |   // We never want to inline functions that contain an indirectbr.  This is | 
| Duncan Sands | b046964 | 2009-11-01 19:12:43 +0000 | [diff] [blame] | 205 |   // incorrect because all the blockaddress's (in static global initializers | 
 | 206 |   // for example) would be referring to the original function, and this indirect | 
| Chris Lattner | 6658870 | 2009-11-01 18:16:30 +0000 | [diff] [blame] | 207 |   // jump would jump from the inlined copy of the function into the original | 
 | 208 |   // function which is extremely undefined behavior. | 
| Chris Lattner | b93a23a | 2009-11-01 03:07:53 +0000 | [diff] [blame] | 209 |   if (isa<IndirectBrInst>(BB->getTerminator())) | 
 | 210 |     NeverInline = true; | 
| Devang Patel | cbd0560 | 2010-03-13 00:10:20 +0000 | [diff] [blame] | 211 |  | 
 | 212 |   // Remember NumInsts for this BB. | 
| Devang Patel | afc33fa | 2010-03-13 01:05:02 +0000 | [diff] [blame^] | 213 |   NumBBInsts[BB] = NumInsts - NumInstsBeforeThisBB; | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 214 | } | 
 | 215 |  | 
 | 216 | /// analyzeFunction - Fill in the current structure with information gleaned | 
 | 217 | /// from the specified function. | 
| Dan Gohman | e7f0ed5 | 2009-10-13 19:58:07 +0000 | [diff] [blame] | 218 | void CodeMetrics::analyzeFunction(Function *F) { | 
 | 219 |   // Look at the size of the callee. | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 220 |   for (Function::const_iterator BB = F->begin(), E = F->end(); BB != E; ++BB) | 
 | 221 |     analyzeBasicBlock(&*BB); | 
| Dan Gohman | e7f0ed5 | 2009-10-13 19:58:07 +0000 | [diff] [blame] | 222 | } | 
 | 223 |  | 
 | 224 | /// analyzeFunction - Fill in the current structure with information gleaned | 
 | 225 | /// from the specified function. | 
 | 226 | void InlineCostAnalyzer::FunctionInfo::analyzeFunction(Function *F) { | 
 | 227 |   Metrics.analyzeFunction(F); | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 228 |  | 
 | 229 |   // A function with exactly one return has it removed during the inlining | 
 | 230 |   // process (see InlineFunction), so don't count it. | 
| Dan Gohman | e7f0ed5 | 2009-10-13 19:58:07 +0000 | [diff] [blame] | 231 |   // FIXME: This knowledge should really be encoded outside of FunctionInfo. | 
 | 232 |   if (Metrics.NumRets==1) | 
 | 233 |     --Metrics.NumInsts; | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 234 |  | 
| Jakob Stoklund Olesen | e3039b6 | 2010-01-26 21:31:24 +0000 | [diff] [blame] | 235 |   // Don't bother calculating argument weights if we are never going to inline | 
 | 236 |   // the function anyway. | 
 | 237 |   if (Metrics.NeverInline) | 
 | 238 |     return; | 
 | 239 |  | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 240 |   // Check out all of the arguments to the function, figuring out how much | 
 | 241 |   // code can be eliminated if one of the arguments is a constant. | 
| Jakob Stoklund Olesen | e3039b6 | 2010-01-26 21:31:24 +0000 | [diff] [blame] | 242 |   ArgumentWeights.reserve(F->arg_size()); | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 243 |   for (Function::arg_iterator I = F->arg_begin(), E = F->arg_end(); I != E; ++I) | 
| Devang Patel | f96769b | 2010-03-13 00:45:31 +0000 | [diff] [blame] | 244 |     ArgumentWeights.push_back(ArgInfo(CountCodeReductionForConstant(I), | 
 | 245 |                                       CountCodeReductionForAlloca(I))); | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 246 | } | 
 | 247 |  | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 248 | // getInlineCost - The heuristic used to determine if we should inline the | 
 | 249 | // function call or not. | 
 | 250 | // | 
 | 251 | InlineCost InlineCostAnalyzer::getInlineCost(CallSite CS, | 
 | 252 |                                SmallPtrSet<const Function *, 16> &NeverInline) { | 
 | 253 |   Instruction *TheCall = CS.getInstruction(); | 
 | 254 |   Function *Callee = CS.getCalledFunction(); | 
 | 255 |   Function *Caller = TheCall->getParent()->getParent(); | 
 | 256 |  | 
 | 257 |   // Don't inline functions which can be redefined at link-time to mean | 
 | 258 |   // something else.  Don't inline functions marked noinline. | 
 | 259 |   if (Callee->mayBeOverridden() || | 
 | 260 |       Callee->hasFnAttr(Attribute::NoInline) || NeverInline.count(Callee)) | 
 | 261 |     return llvm::InlineCost::getNever(); | 
 | 262 |  | 
 | 263 |   // InlineCost - This value measures how good of an inline candidate this call | 
 | 264 |   // site is to inline.  A lower inline cost make is more likely for the call to | 
 | 265 |   // be inlined.  This value may go negative. | 
 | 266 |   // | 
 | 267 |   int InlineCost = 0; | 
 | 268 |    | 
 | 269 |   // If there is only one call of the function, and it has internal linkage, | 
 | 270 |   // make it almost guaranteed to be inlined. | 
 | 271 |   // | 
 | 272 |   if (Callee->hasLocalLinkage() && Callee->hasOneUse()) | 
 | 273 |     InlineCost += InlineConstants::LastCallToStaticBonus; | 
 | 274 |    | 
 | 275 |   // If this function uses the coldcc calling convention, prefer not to inline | 
 | 276 |   // it. | 
 | 277 |   if (Callee->getCallingConv() == CallingConv::Cold) | 
 | 278 |     InlineCost += InlineConstants::ColdccPenalty; | 
 | 279 |    | 
 | 280 |   // If the instruction after the call, or if the normal destination of the | 
 | 281 |   // invoke is an unreachable instruction, the function is noreturn.  As such, | 
 | 282 |   // there is little point in inlining this. | 
 | 283 |   if (InvokeInst *II = dyn_cast<InvokeInst>(TheCall)) { | 
 | 284 |     if (isa<UnreachableInst>(II->getNormalDest()->begin())) | 
 | 285 |       InlineCost += InlineConstants::NoreturnPenalty; | 
 | 286 |   } else if (isa<UnreachableInst>(++BasicBlock::iterator(TheCall))) | 
 | 287 |     InlineCost += InlineConstants::NoreturnPenalty; | 
 | 288 |    | 
 | 289 |   // Get information about the callee... | 
| Dan Gohman | e7f0ed5 | 2009-10-13 19:58:07 +0000 | [diff] [blame] | 290 |   FunctionInfo &CalleeFI = CachedFunctionInfo[Callee]; | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 291 |    | 
 | 292 |   // If we haven't calculated this information yet, do so now. | 
| Dan Gohman | e7f0ed5 | 2009-10-13 19:58:07 +0000 | [diff] [blame] | 293 |   if (CalleeFI.Metrics.NumBlocks == 0) | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 294 |     CalleeFI.analyzeFunction(Callee); | 
 | 295 |  | 
 | 296 |   // If we should never inline this, return a huge cost. | 
| Dan Gohman | e7f0ed5 | 2009-10-13 19:58:07 +0000 | [diff] [blame] | 297 |   if (CalleeFI.Metrics.NeverInline) | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 298 |     return InlineCost::getNever(); | 
 | 299 |  | 
 | 300 |   // FIXME: It would be nice to kill off CalleeFI.NeverInline. Then we | 
| Dan Gohman | e7f0ed5 | 2009-10-13 19:58:07 +0000 | [diff] [blame] | 301 |   // could move this up and avoid computing the FunctionInfo for | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 302 |   // things we are going to just return always inline for. This | 
 | 303 |   // requires handling setjmp somewhere else, however. | 
 | 304 |   if (!Callee->isDeclaration() && Callee->hasFnAttr(Attribute::AlwaysInline)) | 
 | 305 |     return InlineCost::getAlways(); | 
 | 306 |      | 
| Dan Gohman | e7f0ed5 | 2009-10-13 19:58:07 +0000 | [diff] [blame] | 307 |   if (CalleeFI.Metrics.usesDynamicAlloca) { | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 308 |     // Get infomation about the caller... | 
| Dan Gohman | e7f0ed5 | 2009-10-13 19:58:07 +0000 | [diff] [blame] | 309 |     FunctionInfo &CallerFI = CachedFunctionInfo[Caller]; | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 310 |  | 
 | 311 |     // If we haven't calculated this information yet, do so now. | 
| Dan Gohman | e7f0ed5 | 2009-10-13 19:58:07 +0000 | [diff] [blame] | 312 |     if (CallerFI.Metrics.NumBlocks == 0) | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 313 |       CallerFI.analyzeFunction(Caller); | 
 | 314 |  | 
 | 315 |     // Don't inline a callee with dynamic alloca into a caller without them. | 
 | 316 |     // Functions containing dynamic alloca's are inefficient in various ways; | 
 | 317 |     // don't create more inefficiency. | 
| Dan Gohman | e7f0ed5 | 2009-10-13 19:58:07 +0000 | [diff] [blame] | 318 |     if (!CallerFI.Metrics.usesDynamicAlloca) | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 319 |       return InlineCost::getNever(); | 
 | 320 |   } | 
 | 321 |  | 
 | 322 |   // Add to the inline quality for properties that make the call valuable to | 
 | 323 |   // inline.  This includes factors that indicate that the result of inlining | 
 | 324 |   // the function will be optimizable.  Currently this just looks at arguments | 
 | 325 |   // passed into the function. | 
 | 326 |   // | 
 | 327 |   unsigned ArgNo = 0; | 
 | 328 |   for (CallSite::arg_iterator I = CS.arg_begin(), E = CS.arg_end(); | 
 | 329 |        I != E; ++I, ++ArgNo) { | 
 | 330 |     // Each argument passed in has a cost at both the caller and the callee | 
| Jakob Stoklund Olesen | 43cda02 | 2010-01-26 23:21:56 +0000 | [diff] [blame] | 331 |     // sides.  Measurements show that each argument costs about the same as an | 
 | 332 |     // instruction. | 
 | 333 |     InlineCost -= InlineConstants::InstrCost; | 
 | 334 |  | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 335 |     // If an alloca is passed in, inlining this function is likely to allow | 
 | 336 |     // significant future optimization possibilities (like scalar promotion, and | 
 | 337 |     // scalarization), so encourage the inlining of the function. | 
 | 338 |     // | 
| Jakob Stoklund Olesen | 43cda02 | 2010-01-26 23:21:56 +0000 | [diff] [blame] | 339 |     if (isa<AllocaInst>(I)) { | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 340 |       if (ArgNo < CalleeFI.ArgumentWeights.size()) | 
 | 341 |         InlineCost -= CalleeFI.ArgumentWeights[ArgNo].AllocaWeight; | 
| Jakob Stoklund Olesen | 43cda02 | 2010-01-26 23:21:56 +0000 | [diff] [blame] | 342 |  | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 343 |       // If this is a constant being passed into the function, use the argument | 
 | 344 |       // weights calculated for the callee to determine how much will be folded | 
 | 345 |       // away with this information. | 
 | 346 |     } else if (isa<Constant>(I)) { | 
 | 347 |       if (ArgNo < CalleeFI.ArgumentWeights.size()) | 
 | 348 |         InlineCost -= CalleeFI.ArgumentWeights[ArgNo].ConstantWeight; | 
 | 349 |     } | 
 | 350 |   } | 
 | 351 |    | 
 | 352 |   // Now that we have considered all of the factors that make the call site more | 
 | 353 |   // likely to be inlined, look at factors that make us not want to inline it. | 
| Jakob Stoklund Olesen | aa034fa | 2010-02-05 23:21:18 +0000 | [diff] [blame] | 354 |  | 
 | 355 |   // Calls usually take a long time, so they make the inlining gain smaller. | 
 | 356 |   InlineCost += CalleeFI.Metrics.NumCalls * InlineConstants::CallPenalty; | 
 | 357 |  | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 358 |   // Look at the size of the callee. Each instruction counts as 5. | 
| Jakob Stoklund Olesen | 43cda02 | 2010-01-26 23:21:56 +0000 | [diff] [blame] | 359 |   InlineCost += CalleeFI.Metrics.NumInsts*InlineConstants::InstrCost; | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 360 |  | 
 | 361 |   return llvm::InlineCost::get(InlineCost); | 
 | 362 | } | 
 | 363 |  | 
 | 364 | // getInlineFudgeFactor - Return a > 1.0 factor if the inliner should use a | 
 | 365 | // higher threshold to determine if the function call should be inlined. | 
 | 366 | float InlineCostAnalyzer::getInlineFudgeFactor(CallSite CS) { | 
 | 367 |   Function *Callee = CS.getCalledFunction(); | 
 | 368 |    | 
 | 369 |   // Get information about the callee... | 
| Dan Gohman | e7f0ed5 | 2009-10-13 19:58:07 +0000 | [diff] [blame] | 370 |   FunctionInfo &CalleeFI = CachedFunctionInfo[Callee]; | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 371 |    | 
 | 372 |   // If we haven't calculated this information yet, do so now. | 
| Dan Gohman | e7f0ed5 | 2009-10-13 19:58:07 +0000 | [diff] [blame] | 373 |   if (CalleeFI.Metrics.NumBlocks == 0) | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 374 |     CalleeFI.analyzeFunction(Callee); | 
 | 375 |  | 
 | 376 |   float Factor = 1.0f; | 
 | 377 |   // Single BB functions are often written to be inlined. | 
| Dan Gohman | e7f0ed5 | 2009-10-13 19:58:07 +0000 | [diff] [blame] | 378 |   if (CalleeFI.Metrics.NumBlocks == 1) | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 379 |     Factor += 0.5f; | 
 | 380 |  | 
 | 381 |   // Be more aggressive if the function contains a good chunk (if it mades up | 
 | 382 |   // at least 10% of the instructions) of vector instructions. | 
| Dan Gohman | e7f0ed5 | 2009-10-13 19:58:07 +0000 | [diff] [blame] | 383 |   if (CalleeFI.Metrics.NumVectorInsts > CalleeFI.Metrics.NumInsts/2) | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 384 |     Factor += 2.0f; | 
| Dan Gohman | e7f0ed5 | 2009-10-13 19:58:07 +0000 | [diff] [blame] | 385 |   else if (CalleeFI.Metrics.NumVectorInsts > CalleeFI.Metrics.NumInsts/10) | 
| Dan Gohman | e4aeec0 | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 386 |     Factor += 1.5f; | 
 | 387 |   return Factor; | 
 | 388 | } | 
| Jakob Stoklund Olesen | f747747 | 2010-03-09 23:02:17 +0000 | [diff] [blame] | 389 |  | 
 | 390 | /// growCachedCostInfo - update the cached cost info for Caller after Callee has | 
 | 391 | /// been inlined. | 
 | 392 | void | 
 | 393 | InlineCostAnalyzer::growCachedCostInfo(Function* Caller, Function* Callee) { | 
 | 394 |   FunctionInfo &CallerFI = CachedFunctionInfo[Caller]; | 
 | 395 |  | 
 | 396 |   // For small functions we prefer to recalculate the cost for better accuracy. | 
 | 397 |   if (CallerFI.Metrics.NumBlocks < 10 || CallerFI.Metrics.NumInsts < 1000) { | 
 | 398 |     resetCachedCostInfo(Caller); | 
 | 399 |     return; | 
 | 400 |   } | 
 | 401 |  | 
 | 402 |   // For large functions, we can save a lot of computation time by skipping | 
 | 403 |   // recalculations. | 
 | 404 |   if (CallerFI.Metrics.NumCalls > 0) | 
 | 405 |     --CallerFI.Metrics.NumCalls; | 
 | 406 |  | 
 | 407 |   if (Callee) { | 
 | 408 |     FunctionInfo &CalleeFI = CachedFunctionInfo[Callee]; | 
 | 409 |     if (!CalleeFI.Metrics.NumBlocks) { | 
 | 410 |       resetCachedCostInfo(Caller); | 
 | 411 |       return; | 
 | 412 |     } | 
 | 413 |     CallerFI.Metrics.NeverInline |= CalleeFI.Metrics.NeverInline; | 
 | 414 |     CallerFI.Metrics.usesDynamicAlloca |= CalleeFI.Metrics.usesDynamicAlloca; | 
 | 415 |  | 
 | 416 |     CallerFI.Metrics.NumInsts += CalleeFI.Metrics.NumInsts; | 
 | 417 |     CallerFI.Metrics.NumBlocks += CalleeFI.Metrics.NumBlocks; | 
 | 418 |     CallerFI.Metrics.NumCalls += CalleeFI.Metrics.NumCalls; | 
 | 419 |     CallerFI.Metrics.NumVectorInsts += CalleeFI.Metrics.NumVectorInsts; | 
 | 420 |     CallerFI.Metrics.NumRets += CalleeFI.Metrics.NumRets; | 
 | 421 |  | 
 | 422 |     // analyzeBasicBlock counts each function argument as an inst. | 
 | 423 |     if (CallerFI.Metrics.NumInsts >= Callee->arg_size()) | 
 | 424 |       CallerFI.Metrics.NumInsts -= Callee->arg_size(); | 
 | 425 |     else | 
 | 426 |       CallerFI.Metrics.NumInsts = 0; | 
 | 427 |   } | 
 | 428 |   // We are not updating the argumentweights. We have already determined that | 
 | 429 |   // Caller is a fairly large function, so we accept the loss of precision. | 
 | 430 | } |