[llvm-commits] [llvm] r155241 - in /llvm/trunk: include/llvm/Module.h lib/VMCore/Module.cpp lib/VMCore/Type.cpp

Bill Wendling isanbard at gmail.com
Fri Apr 20 14:56:24 PDT 2012


Author: void
Date: Fri Apr 20 16:56:24 2012
New Revision: 155241

URL: http://llvm.org/viewvc/llvm-project?rev=155241&view=rev
Log:
If we discover all of the named structs in a module, then don't bother to
process any more Values.

Modified:
    llvm/trunk/include/llvm/Module.h
    llvm/trunk/lib/VMCore/Module.cpp
    llvm/trunk/lib/VMCore/Type.cpp

Modified: llvm/trunk/include/llvm/Module.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Module.h?rev=155241&r1=155240&r2=155241&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Module.h (original)
+++ llvm/trunk/include/llvm/Module.h Fri Apr 20 16:56:24 2012
@@ -309,6 +309,9 @@
   /// is none by that name.
   StructType *getTypeByName(StringRef Name) const;
 
+  /// getNumNamedStructTypes - Return the number of named struct types.
+  unsigned getNumNamedStructTypes() const;
+
 /// @}
 /// @name Function Accessors
 /// @{

Modified: llvm/trunk/lib/VMCore/Module.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Module.cpp?rev=155241&r1=155240&r2=155241&view=diff
==============================================================================
--- llvm/trunk/lib/VMCore/Module.cpp (original)
+++ llvm/trunk/lib/VMCore/Module.cpp Fri Apr 20 16:56:24 2012
@@ -481,76 +481,116 @@
     // objects, we keep several helper maps.
     DenseSet<const Value*> VisitedConstants;
     DenseSet<Type*> VisitedTypes;
-    
     std::vector<StructType*> &StructTypes;
+
+    const Module *M;
+    unsigned NumNamedStructTypes;
+    unsigned StructTypesSize;
   public:
     TypeFinder(std::vector<StructType*> &structTypes)
-      : StructTypes(structTypes) {}
+      : StructTypes(structTypes), M(0), NumNamedStructTypes(0),
+        StructTypesSize(0) {}
     
-    void run(const Module &M) {
+    void run(const Module &Mod) {
+      M = &Mod;
+      NumNamedStructTypes = M->getNumNamedStructTypes();
+
+      if (NumNamedStructTypes == 0)
+        return;
+
       // Get types from global variables.
-      for (Module::const_global_iterator I = M.global_begin(),
-           E = M.global_end(); I != E; ++I) {
+      for (Module::const_global_iterator I = M->global_begin(),
+           E = M->global_end(); I != E; ++I) {
         incorporateType(I->getType());
         if (I->hasInitializer())
           incorporateValue(I->getInitializer());
       }
       
       // Get types from aliases.
-      for (Module::const_alias_iterator I = M.alias_begin(),
-           E = M.alias_end(); I != E; ++I) {
+      for (Module::const_alias_iterator I = M->alias_begin(),
+           E = M->alias_end(); I != E; ++I) {
         incorporateType(I->getType());
         if (const Value *Aliasee = I->getAliasee())
           incorporateValue(Aliasee);
       }
+
+      if (foundAllStructTypes()) return;
       
       SmallVector<std::pair<unsigned, MDNode*>, 4> MDForInst;
 
       // Get types from functions.
-      for (Module::const_iterator FI = M.begin(), E = M.end(); FI != E; ++FI) {
+      for (Module::const_iterator FI = M->begin(),
+             E = M->end(); FI != E; ++FI) {
         incorporateType(FI->getType());
-        
+        if (foundAllStructTypes()) return;
+
         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.
             incorporateType(I.getType());
             for (User::const_op_iterator OI = I.op_begin(), OE = I.op_end();
-                 OI != OE; ++OI)
+                 OI != OE; ++OI) {
               incorporateValue(*OI);
-            
+              if (foundAllStructTypes()) return;
+            }
+
             // Incorporate types hiding in metadata.
             I.getAllMetadataOtherThanDebugLoc(MDForInst);
-            for (unsigned i = 0, e = MDForInst.size(); i != e; ++i)
+            for (unsigned i = 0, e = MDForInst.size(); i != e; ++i) {
               incorporateMDNode(MDForInst[i].second);
+              if (foundAllStructTypes()) return;
+            }
+
             MDForInst.clear();
           }
       }
       
-      for (Module::const_named_metadata_iterator I = M.named_metadata_begin(),
-           E = M.named_metadata_end(); I != E; ++I) {
+      for (Module::const_named_metadata_iterator I = M->named_metadata_begin(),
+           E = M->named_metadata_end(); I != E; ++I) {
         const NamedMDNode *NMD = I;
-        for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i)
+        for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
           incorporateMDNode(NMD->getOperand(i));
+          if (foundAllStructTypes()) return;
+        }
       }
     }
     
   private:
+    bool foundAllStructTypes() {
+      return StructTypesSize == NumNamedStructTypes;
+    }
+
+    bool addStructType(StructType *ST) {
+      if (foundAllStructTypes()) return false;
+      StructTypes.push_back(ST);
+      ++StructTypesSize;
+      return true;
+    }
+
     void incorporateType(Type *Ty) {
+      if (StructTypesSize == NumNamedStructTypes)
+        return;
+
       // Check to see if we're already visited this type.
       if (!VisitedTypes.insert(Ty).second)
         return;
       
       // If this is a structure or opaque type, add a name for the type.
       if (StructType *STy = dyn_cast<StructType>(Ty))
-        StructTypes.push_back(STy);
+        if (!addStructType(STy))
+          return;
       
       // Recursively walk all contained types.
       for (Type::subtype_iterator I = Ty->subtype_begin(),
-           E = Ty->subtype_end(); I != E; ++I)
+             E = Ty->subtype_end(); I != E; ++I) {
         incorporateType(*I);
+        if (foundAllStructTypes()) return;
+      }
     }
     
     /// incorporateValue - This method is used to walk operand lists finding
@@ -560,7 +600,9 @@
     void incorporateValue(const Value *V) {
       if (const MDNode *M = dyn_cast<MDNode>(V))
         return incorporateMDNode(M);
-      if (!isa<Constant>(V) || isa<GlobalValue>(V)) return;
+
+      if (!isa<Constant>(V) || isa<GlobalValue>(V))
+        return;
       
       // Already visited?
       if (!VisitedConstants.insert(V).second)
@@ -577,15 +619,18 @@
     }
     
     void incorporateMDNode(const MDNode *V) {
-      
+      if (foundAllStructTypes()) return;
+
       // Already visited?
       if (!VisitedConstants.insert(V).second)
         return;
       
       // Look in operands for types.
       for (unsigned i = 0, e = V->getNumOperands(); i != e; ++i)
-        if (Value *Op = V->getOperand(i))
+        if (Value *Op = V->getOperand(i)) {
           incorporateValue(Op);
+          if (foundAllStructTypes()) return;
+        }
     }
   };
 } // end anonymous namespace

Modified: llvm/trunk/lib/VMCore/Type.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Type.cpp?rev=155241&r1=155240&r2=155241&view=diff
==============================================================================
--- llvm/trunk/lib/VMCore/Type.cpp (original)
+++ llvm/trunk/lib/VMCore/Type.cpp Fri Apr 20 16:56:24 2012
@@ -638,6 +638,10 @@
   return 0;
 }
 
+/// getNumNamedStructTypes - Return the number of named struct types.
+unsigned Module::getNumNamedStructTypes() const {
+  return getContext().pImpl->NamedStructTypes.size();
+}
 
 //===----------------------------------------------------------------------===//
 //                       CompositeType Implementation





More information about the llvm-commits mailing list