Make inlining costs more accurate.
authorChris Lattner <sabre@nondot.org>
Sat, 9 Sep 2006 20:40:44 +0000 (20:40 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 9 Sep 2006 20:40:44 +0000 (20:40 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@30231 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/IPO/InlineSimple.cpp

index 643668483573c6cb258af173325e897bcde7bc97..c2aa4cb3809b7fe89600ffc487655aa260bdfcbe 100644 (file)
@@ -138,9 +138,32 @@ void FunctionInfo::analyzeFunction(Function *F) {
   // each instruction counts as 10.
   for (Function::const_iterator BB = F->begin(), E = F->end(); BB != E; ++BB) {
     for (BasicBlock::const_iterator II = BB->begin(), E = BB->end();
-         II != E; ++II)
-      if (!isa<DbgInfoIntrinsic>(II)) 
-        ++NumInsts;
+         II != E; ++II) {
+      if (isa<DbgInfoIntrinsic>(II)) continue;  // Debug intrinsics don't count.
+      
+      // Noop casts don't count.
+      if (const CastInst *CI = dyn_cast<CastInst>(II)) {
+        const Type *OpTy = CI->getOperand(0)->getType();
+        if (CI->getType()->isLosslesslyConvertibleTo(OpTy))
+          continue;
+        if ((isa<PointerType>(CI->getType()) && OpTy->isInteger()) ||
+            (isa<PointerType>(OpTy) && CI->getType()->isInteger()))
+          continue;  // ptr <-> int is *probably* noop cast.
+      } 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.
+        bool AllConstant = true;
+        for (unsigned i = 1, e = GEPI->getNumOperands(); i != e; ++i)
+          if (!isa<ConstantInt>(GEPI->getOperand(i))) {
+            AllConstant = false;
+            break;
+          }
+        if (AllConstant) continue;
+      }
+      
+      ++NumInsts;
+    }
 
     ++NumBlocks;
   }