Limit the number of times we recurse through this algorithm. All of the
authorBill Wendling <isanbard@gmail.com>
Mon, 23 Apr 2012 00:22:55 +0000 (00:22 +0000)
committerBill Wendling <isanbard@gmail.com>
Mon, 23 Apr 2012 00:22:55 +0000 (00:22 +0000)
intructions are processed. So there's no need to look at them if they're used as
operands of other instructions.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@155327 91177308-0d34-0410-b5e6-96231b3b80d8

lib/VMCore/Module.cpp

index 24c2707b5438085ae9f6bd67811ded15fd6f9a2f..1336c18a32cd6ca77d11bc4c88ad7c5b1233de2a 100644 (file)
@@ -505,22 +505,30 @@ namespace {
           incorporateValue(Aliasee);
       }
       
-      SmallVector<std::pair<unsigned, MDNode*>, 4> MDForInst;
-
       // Get types from functions.
+      SmallVector<std::pair<unsigned, MDNode*>, 4> MDForInst;
       for (Module::const_iterator FI = M.begin(), E = M.end(); FI != E; ++FI) {
         incorporateType(FI->getType());
         
+        // First incorporate the arguments.
+        for (Function::const_arg_iterator AI = FI->arg_begin(),
+               AE = FI->arg_end(); AI != AE; ++AI)
+          incorporateValue(AI);
+
         for (Function::const_iterator BB = FI->begin(), E = FI->end();
              BB != E;++BB)
           for (BasicBlock::const_iterator II = BB->begin(),
                E = BB->end(); II != E; ++II) {
             const Instruction &I = *II;
-            // Incorporate the type of the instruction and all its operands.
+            // Incorporate the type of the instruction.
             incorporateType(I.getType());
+
+            // Incorporate non-instruction operand types. (We are incorporating
+            // all instructions with this loop.)
             for (User::const_op_iterator OI = I.op_begin(), OE = I.op_end();
                  OI != OE; ++OI)
-              incorporateValue(*OI);
+              if (!isa<Instruction>(OI))
+                incorporateValue(*OI);
             
             // Incorporate types hiding in metadata.
             I.getAllMetadataOtherThanDebugLoc(MDForInst);
@@ -570,7 +578,11 @@ namespace {
       
       // Check this type.
       incorporateType(V->getType());
-      
+
+      // If this is an instruction, we incorporate it separately.
+      if (isa<Instruction>(V))
+        return;
+
       // Look in operands for types.
       const User *U = cast<User>(V);
       for (Constant::const_op_iterator I = U->op_begin(),