| Dan Gohman | 4552e3c | 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 |  | 
| Dan Gohman | b3862ec | 2010-04-16 15:14:50 +0000 | [diff] [blame] | 21 | /// callIsSmall - If a call is likely to lower to a single target instruction, | 
|  | 22 | /// or is otherwise deemed small return true. | 
|  | 23 | /// TODO: Perhaps calls like memcpy, strcpy, etc? | 
|  | 24 | bool llvm::callIsSmall(const Function *F) { | 
| Eric Christopher | 35dd9e8 | 2010-01-14 21:48:00 +0000 | [diff] [blame] | 25 | if (!F) return false; | 
|  | 26 |  | 
|  | 27 | if (F->hasLocalLinkage()) return false; | 
|  | 28 |  | 
| Eric Christopher | f567e1b | 2010-01-14 23:00:10 +0000 | [diff] [blame] | 29 | if (!F->hasName()) return false; | 
|  | 30 |  | 
|  | 31 | StringRef Name = F->getName(); | 
|  | 32 |  | 
|  | 33 | // These will all likely lower to a single selection DAG node. | 
| Duncan Sands | 145584e | 2010-03-15 14:01:44 +0000 | [diff] [blame] | 34 | if (Name == "copysign" || Name == "copysignf" || Name == "copysignl" || | 
| Eric Christopher | f567e1b | 2010-01-14 23:00:10 +0000 | [diff] [blame] | 35 | Name == "fabs" || Name == "fabsf" || Name == "fabsl" || | 
|  | 36 | Name == "sin" || Name == "sinf" || Name == "sinl" || | 
|  | 37 | Name == "cos" || Name == "cosf" || Name == "cosl" || | 
|  | 38 | Name == "sqrt" || Name == "sqrtf" || Name == "sqrtl" ) | 
|  | 39 | return true; | 
|  | 40 |  | 
|  | 41 | // These are all likely to be optimized into something smaller. | 
|  | 42 | if (Name == "pow" || Name == "powf" || Name == "powl" || | 
|  | 43 | Name == "exp2" || Name == "exp2l" || Name == "exp2f" || | 
|  | 44 | Name == "floor" || Name == "floorf" || Name == "ceil" || | 
|  | 45 | Name == "round" || Name == "ffs" || Name == "ffsl" || | 
|  | 46 | Name == "abs" || Name == "labs" || Name == "llabs") | 
|  | 47 | return true; | 
|  | 48 |  | 
| Eric Christopher | f3ac066 | 2010-01-14 20:12:34 +0000 | [diff] [blame] | 49 | return false; | 
|  | 50 | } | 
|  | 51 |  | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 52 | /// analyzeBasicBlock - Fill in the current structure with information gleaned | 
|  | 53 | /// from the specified block. | 
| Dan Gohman | 2ccea5d | 2009-10-13 19:58:07 +0000 | [diff] [blame] | 54 | void CodeMetrics::analyzeBasicBlock(const BasicBlock *BB) { | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 55 | ++NumBlocks; | 
| Devang Patel | 9314246 | 2010-03-13 01:05:02 +0000 | [diff] [blame] | 56 | unsigned NumInstsBeforeThisBB = NumInsts; | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 57 | for (BasicBlock::const_iterator II = BB->begin(), E = BB->end(); | 
|  | 58 | II != E; ++II) { | 
|  | 59 | if (isa<PHINode>(II)) continue;           // PHI nodes don't count. | 
|  | 60 |  | 
|  | 61 | // Special handling for calls. | 
|  | 62 | if (isa<CallInst>(II) || isa<InvokeInst>(II)) { | 
|  | 63 | if (isa<DbgInfoIntrinsic>(II)) | 
|  | 64 | continue;  // Debug intrinsics don't count as size. | 
| Gabor Greif | d59498b | 2010-07-27 14:15:29 +0000 | [diff] [blame] | 65 |  | 
|  | 66 | ImmutableCallSite CS(cast<Instruction>(II)); | 
|  | 67 |  | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 68 | // If this function contains a call to setjmp or _setjmp, never inline | 
|  | 69 | // it.  This is a hack because we depend on the user marking their local | 
|  | 70 | // variables as volatile if they are live across a setjmp call, and they | 
|  | 71 | // probably won't do this in callers. | 
| Gabor Greif | d59498b | 2010-07-27 14:15:29 +0000 | [diff] [blame] | 72 | if (const Function *F = CS.getCalledFunction()) { | 
| Owen Anderson | 04cf3fd | 2010-09-09 20:32:23 +0000 | [diff] [blame] | 73 | // If a function is both internal and has a single use, then it is | 
|  | 74 | // extremely likely to get inlined in the future (it was probably | 
|  | 75 | // exposed by an interleaved devirtualization pass). | 
|  | 76 | if (F->hasInternalLinkage() && F->hasOneUse()) | 
|  | 77 | ++NumInlineCandidates; | 
|  | 78 |  | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 79 | if (F->isDeclaration() && | 
| Dan Gohman | abb728d | 2009-10-13 20:10:10 +0000 | [diff] [blame] | 80 | (F->getName() == "setjmp" || F->getName() == "_setjmp")) | 
| Kenneth Uildriks | 9b21208 | 2010-06-09 15:11:37 +0000 | [diff] [blame] | 81 | callsSetJmp = true; | 
| Chris Lattner | a9bac86 | 2010-04-30 22:37:22 +0000 | [diff] [blame] | 82 |  | 
|  | 83 | // If this call is to function itself, then the function is recursive. | 
|  | 84 | // Inlining it into other functions is a bad idea, because this is | 
|  | 85 | // basically just a form of loop peeling, and our metrics aren't useful | 
|  | 86 | // for that case. | 
|  | 87 | if (F == BB->getParent()) | 
| Kenneth Uildriks | 9b21208 | 2010-06-09 15:11:37 +0000 | [diff] [blame] | 88 | isRecursive = true; | 
| Chris Lattner | a9bac86 | 2010-04-30 22:37:22 +0000 | [diff] [blame] | 89 | } | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 90 |  | 
| Jakob Stoklund Olesen | b0b2297 | 2010-02-05 23:21:18 +0000 | [diff] [blame] | 91 | if (!isa<IntrinsicInst>(II) && !callIsSmall(CS.getCalledFunction())) { | 
|  | 92 | // Each argument to a call takes on average one instruction to set up. | 
|  | 93 | NumInsts += CS.arg_size(); | 
| Jakob Stoklund Olesen | d67defd | 2010-05-26 22:40:28 +0000 | [diff] [blame] | 94 |  | 
|  | 95 | // We don't want inline asm to count as a call - that would prevent loop | 
|  | 96 | // unrolling. The argument setup cost is still real, though. | 
|  | 97 | if (!isa<InlineAsm>(CS.getCalledValue())) | 
|  | 98 | ++NumCalls; | 
| Jakob Stoklund Olesen | b0b2297 | 2010-02-05 23:21:18 +0000 | [diff] [blame] | 99 | } | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 100 | } | 
|  | 101 |  | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 102 | if (const AllocaInst *AI = dyn_cast<AllocaInst>(II)) { | 
|  | 103 | if (!AI->isStaticAlloca()) | 
|  | 104 | this->usesDynamicAlloca = true; | 
|  | 105 | } | 
|  | 106 |  | 
| Duncan Sands | 19d0b47 | 2010-02-16 11:11:14 +0000 | [diff] [blame] | 107 | if (isa<ExtractElementInst>(II) || II->getType()->isVectorTy()) | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 108 | ++NumVectorInsts; | 
|  | 109 |  | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 110 | if (const CastInst *CI = dyn_cast<CastInst>(II)) { | 
| Evan Cheng | 8e670ee | 2010-01-14 21:04:31 +0000 | [diff] [blame] | 111 | // Noop casts, including ptr <-> int,  don't count. | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 112 | if (CI->isLosslessCast() || isa<IntToPtrInst>(CI) || | 
|  | 113 | isa<PtrToIntInst>(CI)) | 
|  | 114 | continue; | 
| Evan Cheng | 8e670ee | 2010-01-14 21:04:31 +0000 | [diff] [blame] | 115 | // Result of a cmp instruction is often extended (to be used by other | 
|  | 116 | // cmp instructions, logical or return instructions). These are usually | 
|  | 117 | // nop on most sane targets. | 
|  | 118 | if (isa<CmpInst>(CI->getOperand(0))) | 
|  | 119 | continue; | 
| Chris Lattner | 4578f8e | 2009-11-01 03:07:53 +0000 | [diff] [blame] | 120 | } else if (const GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(II)){ | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 121 | // If a GEP has all constant indices, it will probably be folded with | 
|  | 122 | // a load/store. | 
|  | 123 | if (GEPI->hasAllConstantIndices()) | 
|  | 124 | continue; | 
|  | 125 | } | 
|  | 126 |  | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 127 | ++NumInsts; | 
|  | 128 | } | 
| Chris Lattner | 4578f8e | 2009-11-01 03:07:53 +0000 | [diff] [blame] | 129 |  | 
|  | 130 | if (isa<ReturnInst>(BB->getTerminator())) | 
|  | 131 | ++NumRets; | 
|  | 132 |  | 
| Chris Lattner | 1756673 | 2009-11-01 18:16:30 +0000 | [diff] [blame] | 133 | // We never want to inline functions that contain an indirectbr.  This is | 
| Duncan Sands | f25d301 | 2009-11-01 19:12:43 +0000 | [diff] [blame] | 134 | // incorrect because all the blockaddress's (in static global initializers | 
|  | 135 | // for example) would be referring to the original function, and this indirect | 
| Chris Lattner | 1756673 | 2009-11-01 18:16:30 +0000 | [diff] [blame] | 136 | // jump would jump from the inlined copy of the function into the original | 
|  | 137 | // function which is extremely undefined behavior. | 
| Chris Lattner | 4578f8e | 2009-11-01 03:07:53 +0000 | [diff] [blame] | 138 | if (isa<IndirectBrInst>(BB->getTerminator())) | 
| Kenneth Uildriks | 9b21208 | 2010-06-09 15:11:37 +0000 | [diff] [blame] | 139 | containsIndirectBr = true; | 
| Devang Patel | ad591dc | 2010-03-13 00:10:20 +0000 | [diff] [blame] | 140 |  | 
|  | 141 | // Remember NumInsts for this BB. | 
| Devang Patel | 9314246 | 2010-03-13 01:05:02 +0000 | [diff] [blame] | 142 | NumBBInsts[BB] = NumInsts - NumInstsBeforeThisBB; | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 143 | } | 
|  | 144 |  | 
| Kenneth Uildriks | 99463ca | 2010-10-08 13:57:31 +0000 | [diff] [blame] | 145 | // CountBonusForConstant - Figure out an approximation for how much per-call | 
|  | 146 | // performance boost we can expect if the specified value is constant. | 
|  | 147 | unsigned CodeMetrics::CountBonusForConstant(Value *V) { | 
|  | 148 | unsigned Bonus = 0; | 
|  | 149 | for (Value::use_iterator UI = V->use_begin(), E = V->use_end(); UI != E;++UI){ | 
|  | 150 | User *U = *UI; | 
|  | 151 | if (CallInst *CI = dyn_cast<CallInst>(U)) { | 
|  | 152 | // Turning an indirect call into a direct call is a BIG win | 
|  | 153 | if (CI->getCalledValue() == V) | 
|  | 154 | Bonus += InlineConstants::IndirectCallBonus; | 
|  | 155 | } | 
|  | 156 | else if (InvokeInst *II = dyn_cast<InvokeInst>(U)) { | 
|  | 157 | // Turning an indirect call into a direct call is a BIG win | 
|  | 158 | if (II->getCalledValue() == V) | 
|  | 159 | Bonus += InlineConstants::IndirectCallBonus; | 
|  | 160 | } | 
|  | 161 | // FIXME: Eliminating conditional branches and switches should | 
|  | 162 | // also yield a per-call performance boost. | 
|  | 163 | else { | 
|  | 164 | // Figure out the bonuses that wll accrue due to simple constant | 
|  | 165 | // propagation. | 
|  | 166 | Instruction &Inst = cast<Instruction>(*U); | 
|  | 167 |  | 
|  | 168 | // We can't constant propagate instructions which have effects or | 
|  | 169 | // read memory. | 
|  | 170 | // | 
|  | 171 | // FIXME: It would be nice to capture the fact that a load from a | 
|  | 172 | // pointer-to-constant-global is actually a *really* good thing to zap. | 
|  | 173 | // Unfortunately, we don't know the pointer that may get propagated here, | 
|  | 174 | // so we can't make this decision. | 
|  | 175 | if (Inst.mayReadFromMemory() || Inst.mayHaveSideEffects() || | 
|  | 176 | isa<AllocaInst>(Inst)) | 
|  | 177 | continue; | 
|  | 178 |  | 
|  | 179 | bool AllOperandsConstant = true; | 
|  | 180 | for (unsigned i = 0, e = Inst.getNumOperands(); i != e; ++i) | 
|  | 181 | if (!isa<Constant>(Inst.getOperand(i)) && Inst.getOperand(i) != V) { | 
|  | 182 | AllOperandsConstant = false; | 
|  | 183 | break; | 
|  | 184 | } | 
|  | 185 |  | 
|  | 186 | if (AllOperandsConstant) | 
|  | 187 | Bonus += CountBonusForConstant(&Inst); | 
|  | 188 | } | 
|  | 189 | } | 
|  | 190 | return Bonus; | 
|  | 191 | } | 
|  | 192 |  | 
|  | 193 |  | 
| Owen Anderson | a08318a | 2010-09-09 16:56:42 +0000 | [diff] [blame] | 194 | // CountCodeReductionForConstant - Figure out an approximation for how many | 
|  | 195 | // instructions will be constant folded if the specified value is constant. | 
|  | 196 | // | 
|  | 197 | unsigned CodeMetrics::CountCodeReductionForConstant(Value *V) { | 
|  | 198 | unsigned Reduction = 0; | 
|  | 199 | for (Value::use_iterator UI = V->use_begin(), E = V->use_end(); UI != E;++UI){ | 
|  | 200 | User *U = *UI; | 
|  | 201 | if (isa<BranchInst>(U) || isa<SwitchInst>(U)) { | 
|  | 202 | // We will be able to eliminate all but one of the successors. | 
|  | 203 | const TerminatorInst &TI = cast<TerminatorInst>(*U); | 
|  | 204 | const unsigned NumSucc = TI.getNumSuccessors(); | 
|  | 205 | unsigned Instrs = 0; | 
|  | 206 | for (unsigned I = 0; I != NumSucc; ++I) | 
|  | 207 | Instrs += NumBBInsts[TI.getSuccessor(I)]; | 
|  | 208 | // We don't know which blocks will be eliminated, so use the average size. | 
|  | 209 | Reduction += InlineConstants::InstrCost*Instrs*(NumSucc-1)/NumSucc; | 
| Owen Anderson | a08318a | 2010-09-09 16:56:42 +0000 | [diff] [blame] | 210 | } else { | 
|  | 211 | // Figure out if this instruction will be removed due to simple constant | 
|  | 212 | // propagation. | 
|  | 213 | Instruction &Inst = cast<Instruction>(*U); | 
|  | 214 |  | 
|  | 215 | // We can't constant propagate instructions which have effects or | 
|  | 216 | // read memory. | 
|  | 217 | // | 
|  | 218 | // FIXME: It would be nice to capture the fact that a load from a | 
|  | 219 | // pointer-to-constant-global is actually a *really* good thing to zap. | 
|  | 220 | // Unfortunately, we don't know the pointer that may get propagated here, | 
|  | 221 | // so we can't make this decision. | 
|  | 222 | if (Inst.mayReadFromMemory() || Inst.mayHaveSideEffects() || | 
|  | 223 | isa<AllocaInst>(Inst)) | 
|  | 224 | continue; | 
|  | 225 |  | 
|  | 226 | bool AllOperandsConstant = true; | 
|  | 227 | for (unsigned i = 0, e = Inst.getNumOperands(); i != e; ++i) | 
|  | 228 | if (!isa<Constant>(Inst.getOperand(i)) && Inst.getOperand(i) != V) { | 
|  | 229 | AllOperandsConstant = false; | 
|  | 230 | break; | 
|  | 231 | } | 
|  | 232 |  | 
|  | 233 | if (AllOperandsConstant) { | 
|  | 234 | // We will get to remove this instruction... | 
|  | 235 | Reduction += InlineConstants::InstrCost; | 
|  | 236 |  | 
|  | 237 | // And any other instructions that use it which become constants | 
|  | 238 | // themselves. | 
|  | 239 | Reduction += CountCodeReductionForConstant(&Inst); | 
|  | 240 | } | 
|  | 241 | } | 
|  | 242 | } | 
|  | 243 | return Reduction; | 
|  | 244 | } | 
|  | 245 |  | 
|  | 246 | // CountCodeReductionForAlloca - Figure out an approximation of how much smaller | 
|  | 247 | // the function will be if it is inlined into a context where an argument | 
|  | 248 | // becomes an alloca. | 
|  | 249 | // | 
|  | 250 | unsigned CodeMetrics::CountCodeReductionForAlloca(Value *V) { | 
|  | 251 | if (!V->getType()->isPointerTy()) return 0;  // Not a pointer | 
|  | 252 | unsigned Reduction = 0; | 
|  | 253 | for (Value::use_iterator UI = V->use_begin(), E = V->use_end(); UI != E;++UI){ | 
|  | 254 | Instruction *I = cast<Instruction>(*UI); | 
|  | 255 | if (isa<LoadInst>(I) || isa<StoreInst>(I)) | 
|  | 256 | Reduction += InlineConstants::InstrCost; | 
|  | 257 | else if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(I)) { | 
|  | 258 | // If the GEP has variable indices, we won't be able to do much with it. | 
|  | 259 | if (GEP->hasAllConstantIndices()) | 
|  | 260 | Reduction += CountCodeReductionForAlloca(GEP); | 
|  | 261 | } else if (BitCastInst *BCI = dyn_cast<BitCastInst>(I)) { | 
|  | 262 | // Track pointer through bitcasts. | 
|  | 263 | Reduction += CountCodeReductionForAlloca(BCI); | 
|  | 264 | } else { | 
|  | 265 | // If there is some other strange instruction, we're not going to be able | 
|  | 266 | // to do much if we inline this. | 
|  | 267 | return 0; | 
|  | 268 | } | 
|  | 269 | } | 
|  | 270 |  | 
|  | 271 | return Reduction; | 
|  | 272 | } | 
|  | 273 |  | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 274 | /// analyzeFunction - Fill in the current structure with information gleaned | 
|  | 275 | /// from the specified function. | 
| Dan Gohman | 2ccea5d | 2009-10-13 19:58:07 +0000 | [diff] [blame] | 276 | void CodeMetrics::analyzeFunction(Function *F) { | 
|  | 277 | // Look at the size of the callee. | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 278 | for (Function::const_iterator BB = F->begin(), E = F->end(); BB != E; ++BB) | 
|  | 279 | analyzeBasicBlock(&*BB); | 
| Dan Gohman | 2ccea5d | 2009-10-13 19:58:07 +0000 | [diff] [blame] | 280 | } | 
|  | 281 |  | 
|  | 282 | /// analyzeFunction - Fill in the current structure with information gleaned | 
|  | 283 | /// from the specified function. | 
|  | 284 | void InlineCostAnalyzer::FunctionInfo::analyzeFunction(Function *F) { | 
|  | 285 | Metrics.analyzeFunction(F); | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 286 |  | 
|  | 287 | // A function with exactly one return has it removed during the inlining | 
|  | 288 | // process (see InlineFunction), so don't count it. | 
| Dan Gohman | 2ccea5d | 2009-10-13 19:58:07 +0000 | [diff] [blame] | 289 | // FIXME: This knowledge should really be encoded outside of FunctionInfo. | 
|  | 290 | if (Metrics.NumRets==1) | 
|  | 291 | --Metrics.NumInsts; | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 292 |  | 
| Jakob Stoklund Olesen | cab470b | 2010-01-26 21:31:24 +0000 | [diff] [blame] | 293 | // Don't bother calculating argument weights if we are never going to inline | 
|  | 294 | // the function anyway. | 
| Kenneth Uildriks | 9b21208 | 2010-06-09 15:11:37 +0000 | [diff] [blame] | 295 | if (NeverInline()) | 
| Jakob Stoklund Olesen | cab470b | 2010-01-26 21:31:24 +0000 | [diff] [blame] | 296 | return; | 
|  | 297 |  | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 298 | // Check out all of the arguments to the function, figuring out how much | 
|  | 299 | // code can be eliminated if one of the arguments is a constant. | 
| Jakob Stoklund Olesen | cab470b | 2010-01-26 21:31:24 +0000 | [diff] [blame] | 300 | ArgumentWeights.reserve(F->arg_size()); | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 301 | for (Function::arg_iterator I = F->arg_begin(), E = F->arg_end(); I != E; ++I) | 
| Owen Anderson | a08318a | 2010-09-09 16:56:42 +0000 | [diff] [blame] | 302 | ArgumentWeights.push_back(ArgInfo(Metrics.CountCodeReductionForConstant(I), | 
| Kenneth Uildriks | 99463ca | 2010-10-08 13:57:31 +0000 | [diff] [blame] | 303 | Metrics.CountCodeReductionForAlloca(I), | 
|  | 304 | Metrics.CountBonusForConstant(I))); | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 305 | } | 
|  | 306 |  | 
| Kenneth Uildriks | 9b21208 | 2010-06-09 15:11:37 +0000 | [diff] [blame] | 307 | /// NeverInline - returns true if the function should never be inlined into | 
|  | 308 | /// any caller | 
|  | 309 | bool InlineCostAnalyzer::FunctionInfo::NeverInline() | 
|  | 310 | { | 
|  | 311 | return (Metrics.callsSetJmp || Metrics.isRecursive || | 
|  | 312 | Metrics.containsIndirectBr); | 
|  | 313 |  | 
|  | 314 | } | 
| Kenneth Uildriks | b8d7efe | 2010-10-09 22:06:36 +0000 | [diff] [blame] | 315 | // getSpecializationBonus - The heuristic used to determine the per-call | 
|  | 316 | // performance boost for using a specialization of Callee with argument | 
|  | 317 | // specializedArgNo replaced by a constant. | 
|  | 318 | int InlineCostAnalyzer::getSpecializationBonus(Function *Callee, | 
|  | 319 | SmallVectorImpl<unsigned> &SpecializedArgNos) | 
|  | 320 | { | 
|  | 321 | if (Callee->mayBeOverridden()) | 
|  | 322 | return 0; | 
|  | 323 |  | 
|  | 324 | int Bonus = 0; | 
|  | 325 | // If this function uses the coldcc calling convention, prefer not to | 
|  | 326 | // specialize it. | 
|  | 327 | if (Callee->getCallingConv() == CallingConv::Cold) | 
|  | 328 | Bonus -= InlineConstants::ColdccPenalty; | 
|  | 329 |  | 
|  | 330 | // Get information about the callee. | 
|  | 331 | FunctionInfo *CalleeFI = &CachedFunctionInfo[Callee]; | 
|  | 332 |  | 
|  | 333 | // If we haven't calculated this information yet, do so now. | 
|  | 334 | if (CalleeFI->Metrics.NumBlocks == 0) | 
|  | 335 | CalleeFI->analyzeFunction(Callee); | 
|  | 336 |  | 
|  | 337 |  | 
|  | 338 | for (unsigned i = 0, s = SpecializedArgNos.size(); | 
|  | 339 | i < s; ++i ) | 
|  | 340 | { | 
|  | 341 | Bonus += CalleeFI->ArgumentWeights[SpecializedArgNos[i]].ConstantBonus; | 
|  | 342 | } | 
|  | 343 | // Calls usually take a long time, so they make the specialization gain | 
|  | 344 | // smaller. | 
|  | 345 | Bonus -= CalleeFI->Metrics.NumCalls * InlineConstants::CallPenalty; | 
|  | 346 |  | 
|  | 347 | return Bonus; | 
|  | 348 | } | 
|  | 349 |  | 
|  | 350 |  | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 351 | // getInlineCost - The heuristic used to determine if we should inline the | 
|  | 352 | // function call or not. | 
|  | 353 | // | 
|  | 354 | InlineCost InlineCostAnalyzer::getInlineCost(CallSite CS, | 
| Chris Lattner | cea19a4 | 2010-04-17 17:55:00 +0000 | [diff] [blame] | 355 | SmallPtrSet<const Function*, 16> &NeverInline) { | 
| David Chisnall | f4b87f1 | 2010-05-01 15:47:41 +0000 | [diff] [blame] | 356 | return getInlineCost(CS, CS.getCalledFunction(), NeverInline); | 
|  | 357 | } | 
|  | 358 |  | 
|  | 359 | InlineCost InlineCostAnalyzer::getInlineCost(CallSite CS, | 
|  | 360 | Function *Callee, | 
|  | 361 | SmallPtrSet<const Function*, 16> &NeverInline) { | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 362 | Instruction *TheCall = CS.getInstruction(); | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 363 | Function *Caller = TheCall->getParent()->getParent(); | 
| David Chisnall | f4b87f1 | 2010-05-01 15:47:41 +0000 | [diff] [blame] | 364 | bool isDirectCall = CS.getCalledFunction() == Callee; | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 365 |  | 
|  | 366 | // Don't inline functions which can be redefined at link-time to mean | 
| Eric Christopher | b1a382d | 2010-03-25 04:49:10 +0000 | [diff] [blame] | 367 | // something else.  Don't inline functions marked noinline or call sites | 
|  | 368 | // marked noinline. | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 369 | if (Callee->mayBeOverridden() || | 
| Eric Christopher | b1a382d | 2010-03-25 04:49:10 +0000 | [diff] [blame] | 370 | Callee->hasFnAttr(Attribute::NoInline) || NeverInline.count(Callee) || | 
|  | 371 | CS.isNoInline()) | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 372 | return llvm::InlineCost::getNever(); | 
|  | 373 |  | 
|  | 374 | // InlineCost - This value measures how good of an inline candidate this call | 
|  | 375 | // site is to inline.  A lower inline cost make is more likely for the call to | 
|  | 376 | // be inlined.  This value may go negative. | 
|  | 377 | // | 
|  | 378 | int InlineCost = 0; | 
| David Chisnall | f4b87f1 | 2010-05-01 15:47:41 +0000 | [diff] [blame] | 379 |  | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 380 | // If there is only one call of the function, and it has internal linkage, | 
|  | 381 | // make it almost guaranteed to be inlined. | 
|  | 382 | // | 
| David Chisnall | f4b87f1 | 2010-05-01 15:47:41 +0000 | [diff] [blame] | 383 | if (Callee->hasLocalLinkage() && Callee->hasOneUse() && isDirectCall) | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 384 | InlineCost += InlineConstants::LastCallToStaticBonus; | 
|  | 385 |  | 
|  | 386 | // If this function uses the coldcc calling convention, prefer not to inline | 
|  | 387 | // it. | 
|  | 388 | if (Callee->getCallingConv() == CallingConv::Cold) | 
|  | 389 | InlineCost += InlineConstants::ColdccPenalty; | 
|  | 390 |  | 
|  | 391 | // If the instruction after the call, or if the normal destination of the | 
|  | 392 | // invoke is an unreachable instruction, the function is noreturn.  As such, | 
|  | 393 | // there is little point in inlining this. | 
|  | 394 | if (InvokeInst *II = dyn_cast<InvokeInst>(TheCall)) { | 
|  | 395 | if (isa<UnreachableInst>(II->getNormalDest()->begin())) | 
|  | 396 | InlineCost += InlineConstants::NoreturnPenalty; | 
|  | 397 | } else if (isa<UnreachableInst>(++BasicBlock::iterator(TheCall))) | 
|  | 398 | InlineCost += InlineConstants::NoreturnPenalty; | 
|  | 399 |  | 
| Chris Lattner | cea19a4 | 2010-04-17 17:55:00 +0000 | [diff] [blame] | 400 | // Get information about the callee. | 
|  | 401 | FunctionInfo *CalleeFI = &CachedFunctionInfo[Callee]; | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 402 |  | 
|  | 403 | // If we haven't calculated this information yet, do so now. | 
| Chris Lattner | cea19a4 | 2010-04-17 17:55:00 +0000 | [diff] [blame] | 404 | if (CalleeFI->Metrics.NumBlocks == 0) | 
|  | 405 | CalleeFI->analyzeFunction(Callee); | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 406 |  | 
|  | 407 | // If we should never inline this, return a huge cost. | 
| Kenneth Uildriks | 9b21208 | 2010-06-09 15:11:37 +0000 | [diff] [blame] | 408 | if (CalleeFI->NeverInline()) | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 409 | return InlineCost::getNever(); | 
|  | 410 |  | 
| Chris Lattner | cea19a4 | 2010-04-17 17:55:00 +0000 | [diff] [blame] | 411 | // FIXME: It would be nice to kill off CalleeFI->NeverInline. Then we | 
| Dan Gohman | 2ccea5d | 2009-10-13 19:58:07 +0000 | [diff] [blame] | 412 | // could move this up and avoid computing the FunctionInfo for | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 413 | // things we are going to just return always inline for. This | 
|  | 414 | // requires handling setjmp somewhere else, however. | 
|  | 415 | if (!Callee->isDeclaration() && Callee->hasFnAttr(Attribute::AlwaysInline)) | 
|  | 416 | return InlineCost::getAlways(); | 
|  | 417 |  | 
| Chris Lattner | cea19a4 | 2010-04-17 17:55:00 +0000 | [diff] [blame] | 418 | if (CalleeFI->Metrics.usesDynamicAlloca) { | 
|  | 419 | // Get infomation about the caller. | 
| Dan Gohman | 2ccea5d | 2009-10-13 19:58:07 +0000 | [diff] [blame] | 420 | FunctionInfo &CallerFI = CachedFunctionInfo[Caller]; | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 421 |  | 
|  | 422 | // If we haven't calculated this information yet, do so now. | 
| Chris Lattner | 67e7097 | 2010-04-17 17:57:56 +0000 | [diff] [blame] | 423 | if (CallerFI.Metrics.NumBlocks == 0) { | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 424 | CallerFI.analyzeFunction(Caller); | 
| Chris Lattner | 67e7097 | 2010-04-17 17:57:56 +0000 | [diff] [blame] | 425 |  | 
|  | 426 | // Recompute the CalleeFI pointer, getting Caller could have invalidated | 
|  | 427 | // it. | 
|  | 428 | CalleeFI = &CachedFunctionInfo[Callee]; | 
|  | 429 | } | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 430 |  | 
|  | 431 | // Don't inline a callee with dynamic alloca into a caller without them. | 
|  | 432 | // Functions containing dynamic alloca's are inefficient in various ways; | 
|  | 433 | // don't create more inefficiency. | 
| Dan Gohman | 2ccea5d | 2009-10-13 19:58:07 +0000 | [diff] [blame] | 434 | if (!CallerFI.Metrics.usesDynamicAlloca) | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 435 | return InlineCost::getNever(); | 
|  | 436 | } | 
|  | 437 |  | 
|  | 438 | // Add to the inline quality for properties that make the call valuable to | 
|  | 439 | // inline.  This includes factors that indicate that the result of inlining | 
|  | 440 | // the function will be optimizable.  Currently this just looks at arguments | 
|  | 441 | // passed into the function. | 
|  | 442 | // | 
|  | 443 | unsigned ArgNo = 0; | 
|  | 444 | for (CallSite::arg_iterator I = CS.arg_begin(), E = CS.arg_end(); | 
|  | 445 | I != E; ++I, ++ArgNo) { | 
|  | 446 | // Each argument passed in has a cost at both the caller and the callee | 
| Jakob Stoklund Olesen | 0234628 | 2010-01-26 23:21:56 +0000 | [diff] [blame] | 447 | // sides.  Measurements show that each argument costs about the same as an | 
|  | 448 | // instruction. | 
|  | 449 | InlineCost -= InlineConstants::InstrCost; | 
|  | 450 |  | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 451 | // If an alloca is passed in, inlining this function is likely to allow | 
|  | 452 | // significant future optimization possibilities (like scalar promotion, and | 
|  | 453 | // scalarization), so encourage the inlining of the function. | 
|  | 454 | // | 
| Jakob Stoklund Olesen | 0234628 | 2010-01-26 23:21:56 +0000 | [diff] [blame] | 455 | if (isa<AllocaInst>(I)) { | 
| Chris Lattner | cea19a4 | 2010-04-17 17:55:00 +0000 | [diff] [blame] | 456 | if (ArgNo < CalleeFI->ArgumentWeights.size()) | 
|  | 457 | InlineCost -= CalleeFI->ArgumentWeights[ArgNo].AllocaWeight; | 
| Jakob Stoklund Olesen | 0234628 | 2010-01-26 23:21:56 +0000 | [diff] [blame] | 458 |  | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 459 | // If this is a constant being passed into the function, use the argument | 
|  | 460 | // weights calculated for the callee to determine how much will be folded | 
|  | 461 | // away with this information. | 
|  | 462 | } else if (isa<Constant>(I)) { | 
| Chris Lattner | cea19a4 | 2010-04-17 17:55:00 +0000 | [diff] [blame] | 463 | if (ArgNo < CalleeFI->ArgumentWeights.size()) | 
| Kenneth Uildriks | 99463ca | 2010-10-08 13:57:31 +0000 | [diff] [blame] | 464 | InlineCost -= (CalleeFI->ArgumentWeights[ArgNo].ConstantWeight + | 
|  | 465 | CalleeFI->ArgumentWeights[ArgNo].ConstantBonus); | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 466 | } | 
|  | 467 | } | 
|  | 468 |  | 
|  | 469 | // Now that we have considered all of the factors that make the call site more | 
|  | 470 | // likely to be inlined, look at factors that make us not want to inline it. | 
| Jakob Stoklund Olesen | b0b2297 | 2010-02-05 23:21:18 +0000 | [diff] [blame] | 471 |  | 
|  | 472 | // Calls usually take a long time, so they make the inlining gain smaller. | 
| Chris Lattner | cea19a4 | 2010-04-17 17:55:00 +0000 | [diff] [blame] | 473 | InlineCost += CalleeFI->Metrics.NumCalls * InlineConstants::CallPenalty; | 
| Jakob Stoklund Olesen | b0b2297 | 2010-02-05 23:21:18 +0000 | [diff] [blame] | 474 |  | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 475 | // Look at the size of the callee. Each instruction counts as 5. | 
| Chris Lattner | cea19a4 | 2010-04-17 17:55:00 +0000 | [diff] [blame] | 476 | InlineCost += CalleeFI->Metrics.NumInsts*InlineConstants::InstrCost; | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 477 |  | 
|  | 478 | return llvm::InlineCost::get(InlineCost); | 
|  | 479 | } | 
|  | 480 |  | 
| Kenneth Uildriks | b8d7efe | 2010-10-09 22:06:36 +0000 | [diff] [blame] | 481 | // getSpecializationCost - The heuristic used to determine the code-size | 
|  | 482 | // impact of creating a specialized version of Callee with argument | 
|  | 483 | // SpecializedArgNo replaced by a constant. | 
|  | 484 | InlineCost InlineCostAnalyzer::getSpecializationCost(Function *Callee, | 
|  | 485 | SmallVectorImpl<unsigned> &SpecializedArgNos) | 
|  | 486 | { | 
|  | 487 | // Don't specialize functions which can be redefined at link-time to mean | 
|  | 488 | // something else. | 
|  | 489 | if (Callee->mayBeOverridden()) | 
|  | 490 | return llvm::InlineCost::getNever(); | 
|  | 491 |  | 
|  | 492 | // Get information about the callee. | 
|  | 493 | FunctionInfo *CalleeFI = &CachedFunctionInfo[Callee]; | 
|  | 494 |  | 
|  | 495 | // If we haven't calculated this information yet, do so now. | 
|  | 496 | if (CalleeFI->Metrics.NumBlocks == 0) | 
|  | 497 | CalleeFI->analyzeFunction(Callee); | 
|  | 498 |  | 
|  | 499 | int Cost = 0; | 
|  | 500 |  | 
|  | 501 | // Look at the orginal size of the callee.  Each instruction counts as 5. | 
|  | 502 | Cost += CalleeFI->Metrics.NumInsts * InlineConstants::InstrCost; | 
|  | 503 |  | 
|  | 504 | // Offset that with the amount of code that can be constant-folded | 
|  | 505 | // away with the given arguments replaced by constants. | 
|  | 506 | for (SmallVectorImpl<unsigned>::iterator an = SpecializedArgNos.begin(), | 
|  | 507 | ae = SpecializedArgNos.end(); an != ae; ++an) | 
|  | 508 | { | 
|  | 509 | Cost -= CalleeFI->ArgumentWeights[*an].ConstantWeight; | 
|  | 510 | } | 
|  | 511 |  | 
|  | 512 | return llvm::InlineCost::get(Cost); | 
|  | 513 | } | 
|  | 514 |  | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 515 | // getInlineFudgeFactor - Return a > 1.0 factor if the inliner should use a | 
|  | 516 | // higher threshold to determine if the function call should be inlined. | 
|  | 517 | float InlineCostAnalyzer::getInlineFudgeFactor(CallSite CS) { | 
|  | 518 | Function *Callee = CS.getCalledFunction(); | 
|  | 519 |  | 
| Chris Lattner | cea19a4 | 2010-04-17 17:55:00 +0000 | [diff] [blame] | 520 | // Get information about the callee. | 
| Dan Gohman | 2ccea5d | 2009-10-13 19:58:07 +0000 | [diff] [blame] | 521 | FunctionInfo &CalleeFI = CachedFunctionInfo[Callee]; | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 522 |  | 
|  | 523 | // If we haven't calculated this information yet, do so now. | 
| Dan Gohman | 2ccea5d | 2009-10-13 19:58:07 +0000 | [diff] [blame] | 524 | if (CalleeFI.Metrics.NumBlocks == 0) | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 525 | CalleeFI.analyzeFunction(Callee); | 
|  | 526 |  | 
|  | 527 | float Factor = 1.0f; | 
|  | 528 | // Single BB functions are often written to be inlined. | 
| Dan Gohman | 2ccea5d | 2009-10-13 19:58:07 +0000 | [diff] [blame] | 529 | if (CalleeFI.Metrics.NumBlocks == 1) | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 530 | Factor += 0.5f; | 
|  | 531 |  | 
|  | 532 | // Be more aggressive if the function contains a good chunk (if it mades up | 
|  | 533 | // at least 10% of the instructions) of vector instructions. | 
| Dan Gohman | 2ccea5d | 2009-10-13 19:58:07 +0000 | [diff] [blame] | 534 | if (CalleeFI.Metrics.NumVectorInsts > CalleeFI.Metrics.NumInsts/2) | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 535 | Factor += 2.0f; | 
| Dan Gohman | 2ccea5d | 2009-10-13 19:58:07 +0000 | [diff] [blame] | 536 | else if (CalleeFI.Metrics.NumVectorInsts > CalleeFI.Metrics.NumInsts/10) | 
| Dan Gohman | 4552e3c | 2009-10-13 18:30:07 +0000 | [diff] [blame] | 537 | Factor += 1.5f; | 
|  | 538 | return Factor; | 
|  | 539 | } | 
| Jakob Stoklund Olesen | b495cad | 2010-03-09 23:02:17 +0000 | [diff] [blame] | 540 |  | 
|  | 541 | /// growCachedCostInfo - update the cached cost info for Caller after Callee has | 
|  | 542 | /// been inlined. | 
|  | 543 | void | 
| Chris Lattner | cea19a4 | 2010-04-17 17:55:00 +0000 | [diff] [blame] | 544 | InlineCostAnalyzer::growCachedCostInfo(Function *Caller, Function *Callee) { | 
|  | 545 | CodeMetrics &CallerMetrics = CachedFunctionInfo[Caller].Metrics; | 
| Jakob Stoklund Olesen | b495cad | 2010-03-09 23:02:17 +0000 | [diff] [blame] | 546 |  | 
|  | 547 | // For small functions we prefer to recalculate the cost for better accuracy. | 
| Chris Lattner | cea19a4 | 2010-04-17 17:55:00 +0000 | [diff] [blame] | 548 | if (CallerMetrics.NumBlocks < 10 || CallerMetrics.NumInsts < 1000) { | 
| Jakob Stoklund Olesen | b495cad | 2010-03-09 23:02:17 +0000 | [diff] [blame] | 549 | resetCachedCostInfo(Caller); | 
|  | 550 | return; | 
|  | 551 | } | 
|  | 552 |  | 
|  | 553 | // For large functions, we can save a lot of computation time by skipping | 
|  | 554 | // recalculations. | 
| Chris Lattner | cea19a4 | 2010-04-17 17:55:00 +0000 | [diff] [blame] | 555 | if (CallerMetrics.NumCalls > 0) | 
|  | 556 | --CallerMetrics.NumCalls; | 
| Jakob Stoklund Olesen | b495cad | 2010-03-09 23:02:17 +0000 | [diff] [blame] | 557 |  | 
| Chris Lattner | cea19a4 | 2010-04-17 17:55:00 +0000 | [diff] [blame] | 558 | if (Callee == 0) return; | 
|  | 559 |  | 
|  | 560 | CodeMetrics &CalleeMetrics = CachedFunctionInfo[Callee].Metrics; | 
| Jakob Stoklund Olesen | b495cad | 2010-03-09 23:02:17 +0000 | [diff] [blame] | 561 |  | 
| Chris Lattner | cea19a4 | 2010-04-17 17:55:00 +0000 | [diff] [blame] | 562 | // If we don't have metrics for the callee, don't recalculate them just to | 
|  | 563 | // update an approximation in the caller.  Instead, just recalculate the | 
|  | 564 | // caller info from scratch. | 
|  | 565 | if (CalleeMetrics.NumBlocks == 0) { | 
|  | 566 | resetCachedCostInfo(Caller); | 
|  | 567 | return; | 
| Jakob Stoklund Olesen | b495cad | 2010-03-09 23:02:17 +0000 | [diff] [blame] | 568 | } | 
| Chris Lattner | cea19a4 | 2010-04-17 17:55:00 +0000 | [diff] [blame] | 569 |  | 
| Chris Lattner | 67e7097 | 2010-04-17 17:57:56 +0000 | [diff] [blame] | 570 | // Since CalleeMetrics were already calculated, we know that the CallerMetrics | 
| Kenneth Uildriks | 9b21208 | 2010-06-09 15:11:37 +0000 | [diff] [blame] | 571 | // reference isn't invalidated: both were in the DenseMap. | 
| Chris Lattner | cea19a4 | 2010-04-17 17:55:00 +0000 | [diff] [blame] | 572 | CallerMetrics.usesDynamicAlloca |= CalleeMetrics.usesDynamicAlloca; | 
|  | 573 |  | 
| Kenneth Uildriks | 9b21208 | 2010-06-09 15:11:37 +0000 | [diff] [blame] | 574 | // FIXME: If any of these three are true for the callee, the callee was | 
|  | 575 | // not inlined into the caller, so I think they're redundant here. | 
|  | 576 | CallerMetrics.callsSetJmp |= CalleeMetrics.callsSetJmp; | 
|  | 577 | CallerMetrics.isRecursive |= CalleeMetrics.isRecursive; | 
|  | 578 | CallerMetrics.containsIndirectBr |= CalleeMetrics.containsIndirectBr; | 
|  | 579 |  | 
| Chris Lattner | cea19a4 | 2010-04-17 17:55:00 +0000 | [diff] [blame] | 580 | CallerMetrics.NumInsts += CalleeMetrics.NumInsts; | 
|  | 581 | CallerMetrics.NumBlocks += CalleeMetrics.NumBlocks; | 
|  | 582 | CallerMetrics.NumCalls += CalleeMetrics.NumCalls; | 
|  | 583 | CallerMetrics.NumVectorInsts += CalleeMetrics.NumVectorInsts; | 
|  | 584 | CallerMetrics.NumRets += CalleeMetrics.NumRets; | 
|  | 585 |  | 
|  | 586 | // analyzeBasicBlock counts each function argument as an inst. | 
|  | 587 | if (CallerMetrics.NumInsts >= Callee->arg_size()) | 
|  | 588 | CallerMetrics.NumInsts -= Callee->arg_size(); | 
|  | 589 | else | 
|  | 590 | CallerMetrics.NumInsts = 0; | 
|  | 591 |  | 
| Nick Lewycky | c63aa1e | 2010-05-12 21:48:15 +0000 | [diff] [blame] | 592 | // We are not updating the argument weights. We have already determined that | 
| Jakob Stoklund Olesen | b495cad | 2010-03-09 23:02:17 +0000 | [diff] [blame] | 593 | // Caller is a fairly large function, so we accept the loss of precision. | 
|  | 594 | } | 
| Nick Lewycky | c63aa1e | 2010-05-12 21:48:15 +0000 | [diff] [blame] | 595 |  | 
|  | 596 | /// clear - empty the cache of inline costs | 
|  | 597 | void InlineCostAnalyzer::clear() { | 
|  | 598 | CachedFunctionInfo.clear(); | 
|  | 599 | } |