Make 91378 more conservative.
[oota-llvm.git] / lib / Analysis / InlineCost.cpp
index e77fbd1667d418ceaa49385288eae9bdcb6850cb..bd9377bf87fbec2caa3ca07cd8dfeea6ea9d2403 100644 (file)
@@ -21,7 +21,7 @@ using namespace llvm;
 // CountCodeReductionForConstant - Figure out an approximation for how many
 // instructions will be constant folded if the specified value is constant.
 //
-unsigned InlineCostAnalyzer::RegionInfo::
+unsigned InlineCostAnalyzer::FunctionInfo::
          CountCodeReductionForConstant(Value *V) {
   unsigned Reduction = 0;
   for (Value::use_iterator UI = V->use_begin(), E = V->use_end(); UI != E; ++UI)
@@ -31,6 +31,9 @@ unsigned InlineCostAnalyzer::RegionInfo::
       // Eliminating a switch is a big win, proportional to the number of edges
       // deleted.
       Reduction += (SI->getNumSuccessors()-1) * 40;
+    else if (isa<IndirectBrInst>(*UI))
+      // Eliminating an indirect branch is a big win.
+      Reduction += 200;
     else if (CallInst *CI = dyn_cast<CallInst>(*UI)) {
       // Turning an indirect call into a direct call is a BIG win
       Reduction += CI->getCalledValue() == V ? 500 : 0;
@@ -50,7 +53,7 @@ unsigned InlineCostAnalyzer::RegionInfo::
       // Unfortunately, we don't know the pointer that may get propagated here,
       // so we can't make this decision.
       if (Inst.mayReadFromMemory() || Inst.mayHaveSideEffects() ||
-          isa<AllocationInst>(Inst)) 
+          isa<AllocaInst>(Inst)) 
         continue;
 
       bool AllOperandsConstant = true;
@@ -77,7 +80,7 @@ unsigned InlineCostAnalyzer::RegionInfo::
 // the function will be if it is inlined into a context where an argument
 // becomes an alloca.
 //
-unsigned InlineCostAnalyzer::RegionInfo::
+unsigned InlineCostAnalyzer::FunctionInfo::
          CountCodeReductionForAlloca(Value *V) {
   if (!isa<PointerType>(V->getType())) return 0;  // Not a pointer
   unsigned Reduction = 0;
@@ -101,7 +104,7 @@ unsigned InlineCostAnalyzer::RegionInfo::
 
 /// analyzeBasicBlock - Fill in the current structure with information gleaned
 /// from the specified block.
-void InlineCostAnalyzer::RegionInfo::analyzeBasicBlock(const BasicBlock *BB) {
+void CodeMetrics::analyzeBasicBlock(const BasicBlock *BB) {
   ++NumBlocks;
 
   for (BasicBlock::const_iterator II = BB->begin(), E = BB->end();
@@ -121,10 +124,8 @@ void InlineCostAnalyzer::RegionInfo::analyzeBasicBlock(const BasicBlock *BB) {
       // probably won't do this in callers.
       if (Function *F = CS.getCalledFunction())
         if (F->isDeclaration() && 
-            (F->getName() == "setjmp" || F->getName() == "_setjmp")) {
+            (F->getName() == "setjmp" || F->getName() == "_setjmp"))
           NeverInline = true;
-          return;
-        }
 
       // Calls often compile into many machine instructions.  Bump up their
       // cost to reflect this.
@@ -132,10 +133,6 @@ void InlineCostAnalyzer::RegionInfo::analyzeBasicBlock(const BasicBlock *BB) {
         NumInsts += InlineConstants::CallPenalty;
     }
     
-    // These, too, are calls.
-    if (isa<MallocInst>(II) || isa<FreeInst>(II))
-      NumInsts += InlineConstants::CallPenalty;
-
     if (const AllocaInst *AI = dyn_cast<AllocaInst>(II)) {
       if (!AI->isStaticAlloca())
         this->usesDynamicAlloca = true;
@@ -149,34 +146,46 @@ void InlineCostAnalyzer::RegionInfo::analyzeBasicBlock(const BasicBlock *BB) {
       if (CI->isLosslessCast() || isa<IntToPtrInst>(CI) || 
           isa<PtrToIntInst>(CI))
         continue;
-    } else if (const GetElementPtrInst *GEPI =
-               dyn_cast<GetElementPtrInst>(II)) {
+    } else if (const GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(II)){
       // If a GEP has all constant indices, it will probably be folded with
       // a load/store.
       if (GEPI->hasAllConstantIndices())
         continue;
     }
 
-    if (isa<ReturnInst>(II))
-      ++NumRets;
-    
     ++NumInsts;
   }
+  
+  if (isa<ReturnInst>(BB->getTerminator()))
+    ++NumRets;
+  
+  // We never want to inline functions that contain an indirectbr.  This is
+  // incorrect because all the blockaddress's (in static global initializers
+  // for example) would be referring to the original function, and this indirect
+  // jump would jump from the inlined copy of the function into the original
+  // function which is extremely undefined behavior.
+  if (isa<IndirectBrInst>(BB->getTerminator()))
+    NeverInline = true;
 }
 
 /// analyzeFunction - Fill in the current structure with information gleaned
 /// from the specified function.
-void InlineCostAnalyzer::RegionInfo::analyzeFunction(Function *F) {
-  // Look at the size of the callee.  Each basic block counts as 20 units, and
-  // each instruction counts as 5.
+void CodeMetrics::analyzeFunction(Function *F) {
+  // Look at the size of the callee.
   for (Function::const_iterator BB = F->begin(), E = F->end(); BB != E; ++BB)
     analyzeBasicBlock(&*BB);
+}
+
+/// analyzeFunction - Fill in the current structure with information gleaned
+/// from the specified function.
+void InlineCostAnalyzer::FunctionInfo::analyzeFunction(Function *F) {
+  Metrics.analyzeFunction(F);
 
   // A function with exactly one return has it removed during the inlining
   // process (see InlineFunction), so don't count it.
-  // FIXME: This knowledge should really be encoded outside of RegionInfo.
-  if (NumRets==1)
-    --NumInsts;
+  // FIXME: This knowledge should really be encoded outside of FunctionInfo.
+  if (Metrics.NumRets==1)
+    --Metrics.NumInsts;
 
   // Check out all of the arguments to the function, figuring out how much
   // code can be eliminated if one of the arguments is a constant.
@@ -185,8 +194,6 @@ void InlineCostAnalyzer::RegionInfo::analyzeFunction(Function *F) {
                                       CountCodeReductionForAlloca(I)));
 }
 
-
-
 // getInlineCost - The heuristic used to determine if we should inline the
 // function call or not.
 //
@@ -229,35 +236,35 @@ InlineCost InlineCostAnalyzer::getInlineCost(CallSite CS,
     InlineCost += InlineConstants::NoreturnPenalty;
   
   // Get information about the callee...
-  RegionInfo &CalleeFI = CachedFunctionInfo[Callee];
+  FunctionInfo &CalleeFI = CachedFunctionInfo[Callee];
   
   // If we haven't calculated this information yet, do so now.
-  if (CalleeFI.NumBlocks == 0)
+  if (CalleeFI.Metrics.NumBlocks == 0)
     CalleeFI.analyzeFunction(Callee);
 
   // If we should never inline this, return a huge cost.
-  if (CalleeFI.NeverInline)
+  if (CalleeFI.Metrics.NeverInline)
     return InlineCost::getNever();
 
   // FIXME: It would be nice to kill off CalleeFI.NeverInline. Then we
-  // could move this up and avoid computing the RegionInfo for
+  // could move this up and avoid computing the FunctionInfo for
   // things we are going to just return always inline for. This
   // requires handling setjmp somewhere else, however.
   if (!Callee->isDeclaration() && Callee->hasFnAttr(Attribute::AlwaysInline))
     return InlineCost::getAlways();
     
-  if (CalleeFI.usesDynamicAlloca) {
+  if (CalleeFI.Metrics.usesDynamicAlloca) {
     // Get infomation about the caller...
-    RegionInfo &CallerFI = CachedFunctionInfo[Caller];
+    FunctionInfo &CallerFI = CachedFunctionInfo[Caller];
 
     // If we haven't calculated this information yet, do so now.
-    if (CallerFI.NumBlocks == 0)
+    if (CallerFI.Metrics.NumBlocks == 0)
       CallerFI.analyzeFunction(Caller);
 
     // Don't inline a callee with dynamic alloca into a caller without them.
     // Functions containing dynamic alloca's are inefficient in various ways;
     // don't create more inefficiency.
-    if (!CallerFI.usesDynamicAlloca)
+    if (!CallerFI.Metrics.usesDynamicAlloca)
       return InlineCost::getNever();
   }
 
@@ -305,7 +312,7 @@ InlineCost InlineCostAnalyzer::getInlineCost(CallSite CS,
   InlineCost += Caller->size()/15;
   
   // Look at the size of the callee. Each instruction counts as 5.
-  InlineCost += CalleeFI.NumInsts*5;
+  InlineCost += CalleeFI.Metrics.NumInsts*5;
 
   return llvm::InlineCost::get(InlineCost);
 }
@@ -316,22 +323,22 @@ float InlineCostAnalyzer::getInlineFudgeFactor(CallSite CS) {
   Function *Callee = CS.getCalledFunction();
   
   // Get information about the callee...
-  RegionInfo &CalleeFI = CachedFunctionInfo[Callee];
+  FunctionInfo &CalleeFI = CachedFunctionInfo[Callee];
   
   // If we haven't calculated this information yet, do so now.
-  if (CalleeFI.NumBlocks == 0)
+  if (CalleeFI.Metrics.NumBlocks == 0)
     CalleeFI.analyzeFunction(Callee);
 
   float Factor = 1.0f;
   // Single BB functions are often written to be inlined.
-  if (CalleeFI.NumBlocks == 1)
+  if (CalleeFI.Metrics.NumBlocks == 1)
     Factor += 0.5f;
 
   // Be more aggressive if the function contains a good chunk (if it mades up
   // at least 10% of the instructions) of vector instructions.
-  if (CalleeFI.NumVectorInsts > CalleeFI.NumInsts/2)
+  if (CalleeFI.Metrics.NumVectorInsts > CalleeFI.Metrics.NumInsts/2)
     Factor += 2.0f;
-  else if (CalleeFI.NumVectorInsts > CalleeFI.NumInsts/10)
+  else if (CalleeFI.Metrics.NumVectorInsts > CalleeFI.Metrics.NumInsts/10)
     Factor += 1.5f;
   return Factor;
 }