1 //===- Inliner.cpp - Code common to all inliners --------------------------===// 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 the mechanics required to implement inlining without 11 // missing any calls and updating the call graph. The decisions of which calls 12 // are profitable to inline are implemented elsewhere. 13 // 14 //===----------------------------------------------------------------------===// 15 16 #define DEBUG_TYPE "inline" 17 #include "llvm/Module.h" 18 #include "llvm/Instructions.h" 19 #include "llvm/IntrinsicInst.h" 20 #include "llvm/Analysis/CallGraph.h" 21 #include "llvm/Support/CallSite.h" 22 #include "llvm/Target/TargetData.h" 23 #include "llvm/Transforms/IPO/InlinerPass.h" 24 #include "llvm/Transforms/Utils/Cloning.h" 25 #include "llvm/Support/CommandLine.h" 26 #include "llvm/Support/Debug.h" 27 #include "llvm/Support/raw_ostream.h" 28 #include "llvm/ADT/Statistic.h" 29 #include <set> 30 using namespace llvm; 31 32 STATISTIC(NumInlined, "Number of functions inlined"); 33 STATISTIC(NumDeleted, "Number of functions deleted because all callers found"); 34 35 static cl::opt<int> 36 InlineLimit("inline-threshold", cl::Hidden, cl::init(200), 37 cl::desc("Control the amount of inlining to perform (default = 200)")); 38 39 Inliner::Inliner(void *ID) 40 : CallGraphSCCPass(ID), InlineThreshold(InlineLimit) {} 41 42 Inliner::Inliner(void *ID, int Threshold) 43 : CallGraphSCCPass(ID), InlineThreshold(Threshold) {} 44 45 /// getAnalysisUsage - For this class, we declare that we require and preserve 46 /// the call graph. If the derived class implements this method, it should 47 /// always explicitly call the implementation here. 48 void Inliner::getAnalysisUsage(AnalysisUsage &Info) const { 49 CallGraphSCCPass::getAnalysisUsage(Info); 50 } 51 52 // InlineCallIfPossible - If it is possible to inline the specified call site, 53 // do so and update the CallGraph for this operation. 54 bool Inliner::InlineCallIfPossible(CallSite CS, CallGraph &CG, 55 const SmallPtrSet<Function*, 8> &SCCFunctions, 56 const TargetData *TD) { 57 Function *Callee = CS.getCalledFunction(); 58 Function *Caller = CS.getCaller(); 59 60 if (!InlineFunction(CS, &CG, TD)) return false; 61 62 // If the inlined function had a higher stack protection level than the 63 // calling function, then bump up the caller's stack protection level. 64 if (Callee->hasFnAttr(Attribute::StackProtectReq)) 65 Caller->addFnAttr(Attribute::StackProtectReq); 66 else if (Callee->hasFnAttr(Attribute::StackProtect) && 67 !Caller->hasFnAttr(Attribute::StackProtectReq)) 68 Caller->addFnAttr(Attribute::StackProtect); 69 70 // If we inlined the last possible call site to the function, delete the 71 // function body now. 72 if (Callee->use_empty() && (Callee->hasLocalLinkage() || 73 Callee->hasAvailableExternallyLinkage()) && 74 !SCCFunctions.count(Callee)) { 75 DEBUG(errs() << " -> Deleting dead function: " 76 << Callee->getName() << "\n"); 77 CallGraphNode *CalleeNode = CG[Callee]; 78 79 // Remove any call graph edges from the callee to its callees. 80 CalleeNode->removeAllCalledFunctions(); 81 82 resetCachedCostInfo(CalleeNode->getFunction()); 83 84 // Removing the node for callee from the call graph and delete it. 85 delete CG.removeFunctionFromModule(CalleeNode); 86 ++NumDeleted; 87 } 88 return true; 89 } 90 91 /// shouldInline - Return true if the inliner should attempt to inline 92 /// at the given CallSite. 93 bool Inliner::shouldInline(CallSite CS) { 94 InlineCost IC = getInlineCost(CS); 95 float FudgeFactor = getInlineFudgeFactor(CS); 96 97 if (IC.isAlways()) { 98 DEBUG(errs() << " Inlining: cost=always" 99 << ", Call: " << *CS.getInstruction() << "\n"); 100 return true; 101 } 102 103 if (IC.isNever()) { 104 DEBUG(errs() << " NOT Inlining: cost=never" 105 << ", Call: " << *CS.getInstruction() << "\n"); 106 return false; 107 } 108 109 int Cost = IC.getValue(); 110 int CurrentThreshold = InlineThreshold; 111 Function *Fn = CS.getCaller(); 112 if (Fn && !Fn->isDeclaration() && 113 Fn->hasFnAttr(Attribute::OptimizeForSize) && 114 InlineThreshold != 50) 115 CurrentThreshold = 50; 116 117 if (Cost >= (int)(CurrentThreshold * FudgeFactor)) { 118 DEBUG(errs() << " NOT Inlining: cost=" << Cost 119 << ", Call: " << *CS.getInstruction() << "\n"); 120 return false; 121 } else { 122 DEBUG(errs() << " Inlining: cost=" << Cost 123 << ", Call: " << *CS.getInstruction() << "\n"); 124 return true; 125 } 126 } 127 128 bool Inliner::runOnSCC(const std::vector<CallGraphNode*> &SCC) { 129 CallGraph &CG = getAnalysis<CallGraph>(); 130 const TargetData *TD = getAnalysisIfAvailable<TargetData>(); 131 132 SmallPtrSet<Function*, 8> SCCFunctions; 133 DEBUG(errs() << "Inliner visiting SCC:"); 134 for (unsigned i = 0, e = SCC.size(); i != e; ++i) { 135 Function *F = SCC[i]->getFunction(); 136 if (F) SCCFunctions.insert(F); 137 DEBUG(errs() << " " << (F ? F->getName() : "INDIRECTNODE")); 138 } 139 140 // Scan through and identify all call sites ahead of time so that we only 141 // inline call sites in the original functions, not call sites that result 142 // from inlining other functions. 143 std::vector<CallSite> CallSites; 144 145 for (unsigned i = 0, e = SCC.size(); i != e; ++i) 146 if (Function *F = SCC[i]->getFunction()) 147 for (Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB) 148 for (BasicBlock::iterator I = BB->begin(); I != BB->end(); ++I) { 149 CallSite CS = CallSite::get(I); 150 if (CS.getInstruction() && !isa<DbgInfoIntrinsic>(I) && 151 (!CS.getCalledFunction() || 152 !CS.getCalledFunction()->isDeclaration())) 153 CallSites.push_back(CS); 154 } 155 156 DEBUG(errs() << ": " << CallSites.size() << " call sites.\n"); 157 158 // Now that we have all of the call sites, move the ones to functions in the 159 // current SCC to the end of the list. 160 unsigned FirstCallInSCC = CallSites.size(); 161 for (unsigned i = 0; i < FirstCallInSCC; ++i) 162 if (Function *F = CallSites[i].getCalledFunction()) 163 if (SCCFunctions.count(F)) 164 std::swap(CallSites[i--], CallSites[--FirstCallInSCC]); 165 166 // Now that we have all of the call sites, loop over them and inline them if 167 // it looks profitable to do so. 168 bool Changed = false; 169 bool LocalChange; 170 do { 171 LocalChange = false; 172 // Iterate over the outer loop because inlining functions can cause indirect 173 // calls to become direct calls. 174 for (unsigned CSi = 0; CSi != CallSites.size(); ++CSi) 175 if (Function *Callee = CallSites[CSi].getCalledFunction()) { 176 // Calls to external functions are never inlinable. 177 if (Callee->isDeclaration()) { 178 if (SCC.size() == 1) { 179 std::swap(CallSites[CSi], CallSites.back()); 180 CallSites.pop_back(); 181 } else { 182 // Keep the 'in SCC / not in SCC' boundary correct. 183 CallSites.erase(CallSites.begin()+CSi); 184 } 185 --CSi; 186 continue; 187 } 188 189 // If the policy determines that we should inline this function, 190 // try to do so. 191 CallSite CS = CallSites[CSi]; 192 if (shouldInline(CS)) { 193 Function *Caller = CS.getCaller(); 194 // Attempt to inline the function... 195 if (InlineCallIfPossible(CS, CG, SCCFunctions, TD)) { 196 // Remove any cached cost info for this caller, as inlining the 197 // callee has increased the size of the caller (which may be the 198 // same as the callee). 199 resetCachedCostInfo(Caller); 200 201 // Remove this call site from the list. If possible, use 202 // swap/pop_back for efficiency, but do not use it if doing so would 203 // move a call site to a function in this SCC before the 204 // 'FirstCallInSCC' barrier. 205 if (SCC.size() == 1) { 206 std::swap(CallSites[CSi], CallSites.back()); 207 CallSites.pop_back(); 208 } else { 209 CallSites.erase(CallSites.begin()+CSi); 210 } 211 --CSi; 212 213 ++NumInlined; 214 Changed = true; 215 LocalChange = true; 216 } 217 } 218 } 219 } while (LocalChange); 220 221 return Changed; 222 } 223 224 // doFinalization - Remove now-dead linkonce functions at the end of 225 // processing to avoid breaking the SCC traversal. 226 bool Inliner::doFinalization(CallGraph &CG) { 227 return removeDeadFunctions(CG); 228 } 229 230 /// removeDeadFunctions - Remove dead functions that are not included in 231 /// DNR (Do Not Remove) list. 232 bool Inliner::removeDeadFunctions(CallGraph &CG, 233 SmallPtrSet<const Function *, 16> *DNR) { 234 std::set<CallGraphNode*> FunctionsToRemove; 235 236 // Scan for all of the functions, looking for ones that should now be removed 237 // from the program. Insert the dead ones in the FunctionsToRemove set. 238 for (CallGraph::iterator I = CG.begin(), E = CG.end(); I != E; ++I) { 239 CallGraphNode *CGN = I->second; 240 if (Function *F = CGN ? CGN->getFunction() : 0) { 241 // If the only remaining users of the function are dead constants, remove 242 // them. 243 F->removeDeadConstantUsers(); 244 245 if (DNR && DNR->count(F)) 246 continue; 247 248 if ((F->hasLinkOnceLinkage() || F->hasLocalLinkage()) && 249 F->use_empty()) { 250 251 // Remove any call graph edges from the function to its callees. 252 CGN->removeAllCalledFunctions(); 253 254 // Remove any edges from the external node to the function's call graph 255 // node. These edges might have been made irrelegant due to 256 // optimization of the program. 257 CG.getExternalCallingNode()->removeAnyCallEdgeTo(CGN); 258 259 // Removing the node for callee from the call graph and delete it. 260 FunctionsToRemove.insert(CGN); 261 } 262 } 263 } 264 265 // Now that we know which functions to delete, do so. We didn't want to do 266 // this inline, because that would invalidate our CallGraph::iterator 267 // objects. :( 268 bool Changed = false; 269 for (std::set<CallGraphNode*>::iterator I = FunctionsToRemove.begin(), 270 E = FunctionsToRemove.end(); I != E; ++I) { 271 resetCachedCostInfo((*I)->getFunction()); 272 delete CG.removeFunctionFromModule(*I); 273 ++NumDeleted; 274 Changed = true; 275 } 276 277 return Changed; 278 } 279