| Devang Patel | 3322711 | 2007-07-25 18:00:25 +0000 | [diff] [blame] | 1 | //===- InlineCoast.cpp - Cost analysis for inliner ------------------------===// | 
|  | 2 | // | 
|  | 3 | //                     The LLVM Compiler Infrastructure | 
|  | 4 | // | 
| Chris Lattner | f3ebc3f | 2007-12-29 20:36:04 +0000 | [diff] [blame] | 5 | // This file is distributed under the University of Illinois Open Source | 
|  | 6 | // License. See LICENSE.TXT for details. | 
| Devang Patel | 3322711 | 2007-07-25 18:00:25 +0000 | [diff] [blame] | 7 | // | 
|  | 8 | //===----------------------------------------------------------------------===// | 
|  | 9 | // | 
|  | 10 | // This file implements inline cost analysis. | 
|  | 11 | // | 
|  | 12 | //===----------------------------------------------------------------------===// | 
|  | 13 |  | 
|  | 14 |  | 
|  | 15 | #include "llvm/Transforms/Utils/InlineCost.h" | 
|  | 16 | #include "llvm/Support/CallSite.h" | 
|  | 17 | #include "llvm/CallingConv.h" | 
|  | 18 | #include "llvm/IntrinsicInst.h" | 
|  | 19 |  | 
|  | 20 | using namespace llvm; | 
|  | 21 |  | 
|  | 22 | // CountCodeReductionForConstant - Figure out an approximation for how many | 
|  | 23 | // instructions will be constant folded if the specified value is constant. | 
|  | 24 | // | 
|  | 25 | unsigned InlineCostAnalyzer::FunctionInfo:: | 
|  | 26 | CountCodeReductionForConstant(Value *V) { | 
|  | 27 | unsigned Reduction = 0; | 
|  | 28 | for (Value::use_iterator UI = V->use_begin(), E = V->use_end(); UI != E; ++UI) | 
|  | 29 | if (isa<BranchInst>(*UI)) | 
|  | 30 | Reduction += 40;          // Eliminating a conditional branch is a big win | 
|  | 31 | else if (SwitchInst *SI = dyn_cast<SwitchInst>(*UI)) | 
|  | 32 | // Eliminating a switch is a big win, proportional to the number of edges | 
|  | 33 | // deleted. | 
|  | 34 | Reduction += (SI->getNumSuccessors()-1) * 40; | 
|  | 35 | else if (CallInst *CI = dyn_cast<CallInst>(*UI)) { | 
|  | 36 | // Turning an indirect call into a direct call is a BIG win | 
|  | 37 | Reduction += CI->getCalledValue() == V ? 500 : 0; | 
|  | 38 | } else if (InvokeInst *II = dyn_cast<InvokeInst>(*UI)) { | 
|  | 39 | // Turning an indirect call into a direct call is a BIG win | 
|  | 40 | Reduction += II->getCalledValue() == V ? 500 : 0; | 
|  | 41 | } else { | 
|  | 42 | // Figure out if this instruction will be removed due to simple constant | 
|  | 43 | // propagation. | 
|  | 44 | Instruction &Inst = cast<Instruction>(**UI); | 
|  | 45 | bool AllOperandsConstant = true; | 
|  | 46 | for (unsigned i = 0, e = Inst.getNumOperands(); i != e; ++i) | 
|  | 47 | if (!isa<Constant>(Inst.getOperand(i)) && Inst.getOperand(i) != V) { | 
|  | 48 | AllOperandsConstant = false; | 
|  | 49 | break; | 
|  | 50 | } | 
|  | 51 |  | 
|  | 52 | if (AllOperandsConstant) { | 
|  | 53 | // We will get to remove this instruction... | 
|  | 54 | Reduction += 7; | 
|  | 55 |  | 
|  | 56 | // And any other instructions that use it which become constants | 
|  | 57 | // themselves. | 
|  | 58 | Reduction += CountCodeReductionForConstant(&Inst); | 
|  | 59 | } | 
|  | 60 | } | 
|  | 61 |  | 
|  | 62 | return Reduction; | 
|  | 63 | } | 
|  | 64 |  | 
|  | 65 | // CountCodeReductionForAlloca - Figure out an approximation of how much smaller | 
|  | 66 | // the function will be if it is inlined into a context where an argument | 
|  | 67 | // becomes an alloca. | 
|  | 68 | // | 
|  | 69 | unsigned InlineCostAnalyzer::FunctionInfo:: | 
|  | 70 | CountCodeReductionForAlloca(Value *V) { | 
|  | 71 | if (!isa<PointerType>(V->getType())) return 0;  // Not a pointer | 
|  | 72 | unsigned Reduction = 0; | 
|  | 73 | for (Value::use_iterator UI = V->use_begin(), E = V->use_end(); UI != E;++UI){ | 
|  | 74 | Instruction *I = cast<Instruction>(*UI); | 
|  | 75 | if (isa<LoadInst>(I) || isa<StoreInst>(I)) | 
|  | 76 | Reduction += 10; | 
|  | 77 | else if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(I)) { | 
|  | 78 | // If the GEP has variable indices, we won't be able to do much with it. | 
|  | 79 | for (Instruction::op_iterator I = GEP->op_begin()+1, E = GEP->op_end(); | 
|  | 80 | I != E; ++I) | 
|  | 81 | if (!isa<Constant>(*I)) return 0; | 
|  | 82 | Reduction += CountCodeReductionForAlloca(GEP)+15; | 
|  | 83 | } else { | 
|  | 84 | // If there is some other strange instruction, we're not going to be able | 
|  | 85 | // to do much if we inline this. | 
|  | 86 | return 0; | 
|  | 87 | } | 
|  | 88 | } | 
|  | 89 |  | 
|  | 90 | return Reduction; | 
|  | 91 | } | 
|  | 92 |  | 
|  | 93 | /// analyzeFunction - Fill in the current structure with information gleaned | 
|  | 94 | /// from the specified function. | 
|  | 95 | void InlineCostAnalyzer::FunctionInfo::analyzeFunction(Function *F) { | 
| Evan Cheng | 3471ae8 | 2008-03-24 06:37:48 +0000 | [diff] [blame] | 96 | unsigned NumInsts = 0, NumBlocks = 0, NumVectorInsts = 0; | 
| Devang Patel | 3322711 | 2007-07-25 18:00:25 +0000 | [diff] [blame] | 97 |  | 
|  | 98 | // Look at the size of the callee.  Each basic block counts as 20 units, and | 
| Devang Patel | 9d1af9b | 2007-09-17 20:07:40 +0000 | [diff] [blame] | 99 | // each instruction counts as 5. | 
| Devang Patel | 3322711 | 2007-07-25 18:00:25 +0000 | [diff] [blame] | 100 | for (Function::const_iterator BB = F->begin(), E = F->end(); BB != E; ++BB) { | 
|  | 101 | for (BasicBlock::const_iterator II = BB->begin(), E = BB->end(); | 
|  | 102 | II != E; ++II) { | 
|  | 103 | if (isa<DbgInfoIntrinsic>(II)) continue;  // Debug intrinsics don't count. | 
| Evan Cheng | 3471ae8 | 2008-03-24 06:37:48 +0000 | [diff] [blame] | 104 | if (isa<PHINode>(II)) continue;           // PHI nodes don't count. | 
|  | 105 |  | 
|  | 106 | if (isa<InsertElementInst>(II) || isa<ExtractElementInst>(II) || | 
|  | 107 | isa<ShuffleVectorInst>(II) || isa<VectorType>(II->getType())) | 
|  | 108 | ++NumVectorInsts; | 
| Devang Patel | 3322711 | 2007-07-25 18:00:25 +0000 | [diff] [blame] | 109 |  | 
|  | 110 | // Noop casts, including ptr <-> int,  don't count. | 
|  | 111 | if (const CastInst *CI = dyn_cast<CastInst>(II)) { | 
|  | 112 | if (CI->isLosslessCast() || isa<IntToPtrInst>(CI) || | 
|  | 113 | isa<PtrToIntInst>(CI)) | 
|  | 114 | continue; | 
|  | 115 | } else if (const GetElementPtrInst *GEPI = | 
| Evan Cheng | 3471ae8 | 2008-03-24 06:37:48 +0000 | [diff] [blame] | 116 | dyn_cast<GetElementPtrInst>(II)) { | 
| Devang Patel | 3322711 | 2007-07-25 18:00:25 +0000 | [diff] [blame] | 117 | // If a GEP has all constant indices, it will probably be folded with | 
|  | 118 | // a load/store. | 
|  | 119 | bool AllConstant = true; | 
|  | 120 | for (unsigned i = 1, e = GEPI->getNumOperands(); i != e; ++i) | 
|  | 121 | if (!isa<ConstantInt>(GEPI->getOperand(i))) { | 
|  | 122 | AllConstant = false; | 
|  | 123 | break; | 
|  | 124 | } | 
|  | 125 | if (AllConstant) continue; | 
|  | 126 | } | 
|  | 127 |  | 
|  | 128 | ++NumInsts; | 
|  | 129 | } | 
|  | 130 |  | 
|  | 131 | ++NumBlocks; | 
|  | 132 | } | 
|  | 133 |  | 
| Evan Cheng | 3471ae8 | 2008-03-24 06:37:48 +0000 | [diff] [blame] | 134 | this->NumBlocks      = NumBlocks; | 
|  | 135 | this->NumInsts       = NumInsts; | 
|  | 136 | this->NumVectorInsts = NumVectorInsts; | 
| Devang Patel | 3322711 | 2007-07-25 18:00:25 +0000 | [diff] [blame] | 137 |  | 
|  | 138 | // Check out all of the arguments to the function, figuring out how much | 
|  | 139 | // code can be eliminated if one of the arguments is a constant. | 
|  | 140 | for (Function::arg_iterator I = F->arg_begin(), E = F->arg_end(); I != E; ++I) | 
|  | 141 | ArgumentWeights.push_back(ArgInfo(CountCodeReductionForConstant(I), | 
|  | 142 | CountCodeReductionForAlloca(I))); | 
|  | 143 | } | 
|  | 144 |  | 
|  | 145 |  | 
|  | 146 |  | 
|  | 147 | // getInlineCost - The heuristic used to determine if we should inline the | 
|  | 148 | // function call or not. | 
|  | 149 | // | 
| Evan Cheng | 5daf090 | 2008-03-20 00:20:23 +0000 | [diff] [blame] | 150 | int InlineCostAnalyzer::getInlineCost(CallSite CS, | 
|  | 151 | SmallPtrSet<const Function *, 16> &NeverInline) { | 
| Devang Patel | 3322711 | 2007-07-25 18:00:25 +0000 | [diff] [blame] | 152 | Instruction *TheCall = CS.getInstruction(); | 
|  | 153 | Function *Callee = CS.getCalledFunction(); | 
|  | 154 | const Function *Caller = TheCall->getParent()->getParent(); | 
|  | 155 |  | 
|  | 156 | // Don't inline a directly recursive call. | 
|  | 157 | if (Caller == Callee || | 
|  | 158 | // Don't inline functions which can be redefined at link-time to mean | 
|  | 159 | // something else.  link-once linkage is ok though. | 
|  | 160 | Callee->hasWeakLinkage() || | 
|  | 161 |  | 
|  | 162 | // Don't inline functions marked noinline. | 
|  | 163 | NeverInline.count(Callee)) | 
|  | 164 | return 2000000000; | 
|  | 165 |  | 
|  | 166 | // InlineCost - This value measures how good of an inline candidate this call | 
|  | 167 | // site is to inline.  A lower inline cost make is more likely for the call to | 
|  | 168 | // be inlined.  This value may go negative. | 
|  | 169 | // | 
|  | 170 | int InlineCost = 0; | 
|  | 171 |  | 
|  | 172 | // If there is only one call of the function, and it has internal linkage, | 
|  | 173 | // make it almost guaranteed to be inlined. | 
|  | 174 | // | 
|  | 175 | if (Callee->hasInternalLinkage() && Callee->hasOneUse()) | 
| Evan Cheng | 608eeef | 2008-04-24 18:42:47 +0000 | [diff] [blame] | 176 | InlineCost -= 15000; | 
| Devang Patel | 3322711 | 2007-07-25 18:00:25 +0000 | [diff] [blame] | 177 |  | 
|  | 178 | // If this function uses the coldcc calling convention, prefer not to inline | 
|  | 179 | // it. | 
|  | 180 | if (Callee->getCallingConv() == CallingConv::Cold) | 
|  | 181 | InlineCost += 2000; | 
|  | 182 |  | 
|  | 183 | // If the instruction after the call, or if the normal destination of the | 
|  | 184 | // invoke is an unreachable instruction, the function is noreturn.  As such, | 
|  | 185 | // there is little point in inlining this. | 
|  | 186 | if (InvokeInst *II = dyn_cast<InvokeInst>(TheCall)) { | 
|  | 187 | if (isa<UnreachableInst>(II->getNormalDest()->begin())) | 
|  | 188 | InlineCost += 10000; | 
|  | 189 | } else if (isa<UnreachableInst>(++BasicBlock::iterator(TheCall))) | 
|  | 190 | InlineCost += 10000; | 
|  | 191 |  | 
|  | 192 | // Get information about the callee... | 
|  | 193 | FunctionInfo &CalleeFI = CachedFunctionInfo[Callee]; | 
|  | 194 |  | 
|  | 195 | // If we haven't calculated this information yet, do so now. | 
|  | 196 | if (CalleeFI.NumBlocks == 0) | 
|  | 197 | CalleeFI.analyzeFunction(Callee); | 
|  | 198 |  | 
|  | 199 | // Add to the inline quality for properties that make the call valuable to | 
|  | 200 | // inline.  This includes factors that indicate that the result of inlining | 
|  | 201 | // the function will be optimizable.  Currently this just looks at arguments | 
|  | 202 | // passed into the function. | 
|  | 203 | // | 
|  | 204 | unsigned ArgNo = 0; | 
|  | 205 | for (CallSite::arg_iterator I = CS.arg_begin(), E = CS.arg_end(); | 
|  | 206 | I != E; ++I, ++ArgNo) { | 
|  | 207 | // Each argument passed in has a cost at both the caller and the callee | 
|  | 208 | // sides.  This favors functions that take many arguments over functions | 
|  | 209 | // that take few arguments. | 
|  | 210 | InlineCost -= 20; | 
|  | 211 |  | 
|  | 212 | // If this is a function being passed in, it is very likely that we will be | 
|  | 213 | // able to turn an indirect function call into a direct function call. | 
|  | 214 | if (isa<Function>(I)) | 
|  | 215 | InlineCost -= 100; | 
|  | 216 |  | 
|  | 217 | // If an alloca is passed in, inlining this function is likely to allow | 
|  | 218 | // significant future optimization possibilities (like scalar promotion, and | 
|  | 219 | // scalarization), so encourage the inlining of the function. | 
|  | 220 | // | 
|  | 221 | else if (isa<AllocaInst>(I)) { | 
|  | 222 | if (ArgNo < CalleeFI.ArgumentWeights.size()) | 
|  | 223 | InlineCost -= CalleeFI.ArgumentWeights[ArgNo].AllocaWeight; | 
|  | 224 |  | 
|  | 225 | // If this is a constant being passed into the function, use the argument | 
|  | 226 | // weights calculated for the callee to determine how much will be folded | 
|  | 227 | // away with this information. | 
|  | 228 | } else if (isa<Constant>(I)) { | 
|  | 229 | if (ArgNo < CalleeFI.ArgumentWeights.size()) | 
|  | 230 | InlineCost -= CalleeFI.ArgumentWeights[ArgNo].ConstantWeight; | 
|  | 231 | } | 
|  | 232 | } | 
|  | 233 |  | 
|  | 234 | // Now that we have considered all of the factors that make the call site more | 
|  | 235 | // likely to be inlined, look at factors that make us not want to inline it. | 
|  | 236 |  | 
| Evan Cheng | ac38d44 | 2008-04-01 23:59:29 +0000 | [diff] [blame] | 237 | // Don't inline into something too big, which would make it bigger. | 
| Devang Patel | 3322711 | 2007-07-25 18:00:25 +0000 | [diff] [blame] | 238 | // | 
| Evan Cheng | 608eeef | 2008-04-24 18:42:47 +0000 | [diff] [blame] | 239 | InlineCost += Caller->size()/15; | 
| Devang Patel | 3322711 | 2007-07-25 18:00:25 +0000 | [diff] [blame] | 240 |  | 
| Evan Cheng | ac38d44 | 2008-04-01 23:59:29 +0000 | [diff] [blame] | 241 | // Look at the size of the callee. Each instruction counts as 5. | 
|  | 242 | InlineCost += CalleeFI.NumInsts*5; | 
| Evan Cheng | 3471ae8 | 2008-03-24 06:37:48 +0000 | [diff] [blame] | 243 |  | 
| Devang Patel | 3322711 | 2007-07-25 18:00:25 +0000 | [diff] [blame] | 244 | return InlineCost; | 
|  | 245 | } | 
|  | 246 |  | 
| Evan Cheng | 3471ae8 | 2008-03-24 06:37:48 +0000 | [diff] [blame] | 247 | // getInlineFudgeFactor - Return a > 1.0 factor if the inliner should use a | 
|  | 248 | // higher threshold to determine if the function call should be inlined. | 
|  | 249 | float InlineCostAnalyzer::getInlineFudgeFactor(CallSite CS) { | 
|  | 250 | Function *Callee = CS.getCalledFunction(); | 
|  | 251 |  | 
|  | 252 | // Get information about the callee... | 
|  | 253 | FunctionInfo &CalleeFI = CachedFunctionInfo[Callee]; | 
|  | 254 |  | 
|  | 255 | // If we haven't calculated this information yet, do so now. | 
|  | 256 | if (CalleeFI.NumBlocks == 0) | 
|  | 257 | CalleeFI.analyzeFunction(Callee); | 
|  | 258 |  | 
| Evan Cheng | ac38d44 | 2008-04-01 23:59:29 +0000 | [diff] [blame] | 259 | float Factor = 1.0f; | 
|  | 260 | // Single BB functions are often written to be inlined. | 
|  | 261 | if (CalleeFI.NumBlocks == 1) | 
|  | 262 | Factor += 0.5f; | 
|  | 263 |  | 
| Evan Cheng | 3471ae8 | 2008-03-24 06:37:48 +0000 | [diff] [blame] | 264 | // Be more aggressive if the function contains a good chunk (if it mades up | 
|  | 265 | // at least 10% of the instructions) of vector instructions. | 
| Evan Cheng | ac38d44 | 2008-04-01 23:59:29 +0000 | [diff] [blame] | 266 | if (CalleeFI.NumVectorInsts > CalleeFI.NumInsts/2) | 
|  | 267 | Factor += 2.0f; | 
|  | 268 | else if (CalleeFI.NumVectorInsts > CalleeFI.NumInsts/10) | 
|  | 269 | Factor += 1.5f; | 
|  | 270 | return Factor; | 
| Evan Cheng | 3471ae8 | 2008-03-24 06:37:48 +0000 | [diff] [blame] | 271 | } |