simplify getOrCreateTypeSlot, eliminat doInsertType. Eliminate post-order iteration...
authorChris Lattner <sabre@nondot.org>
Sat, 10 Feb 2007 05:02:50 +0000 (05:02 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 10 Feb 2007 05:02:50 +0000 (05:02 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34127 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Bytecode/Writer/SlotCalculator.cpp
lib/Bytecode/Writer/SlotCalculator.h

index 00f7cbc5aeaeb6fd45bbc2c716f1bc8beedcaa16..d4c16e9bac52eb6b4e86e3b4eb6693c855459303 100644 (file)
@@ -24,7 +24,6 @@
 #include "llvm/TypeSymbolTable.h"
 #include "llvm/Type.h"
 #include "llvm/ValueSymbolTable.h"
-#include "llvm/ADT/PostOrderIterator.h"
 #include "llvm/ADT/STLExtras.h"
 #include <algorithm>
 #include <functional>
@@ -355,34 +354,16 @@ unsigned SlotCalculator::getOrCreateTypeSlot(const Type *Ty) {
   int SlotNo = getTypeSlot(Ty);        // Check to see if it's already in!
   if (SlotNo != -1) return (unsigned)SlotNo;
 
-  // Insert the current type before any subtypes.  This is important because
-  // recursive types elements are inserted in a bottom up order.  Changing
-  // this here can break things.  For example:
-  //
-  //    global { \2 * } { { \2 }* null }
-  //
-  unsigned ResultSlot = doInsertType(Ty);
-
-  // Loop over any contained types in the definition... in post
-  // order.
-  for (po_iterator<const Type*> I = po_begin(Ty), E = po_end(Ty);
-       I != E; ++I) {
-    if (*I != Ty && !TypeMap.count(*I)) {
-      // If we haven't seen this sub type before, add it to our type table!
-      doInsertType(*I);
-    }
-  }
-  return ResultSlot;
-}
-
-
-// doInsertType - This is a small helper function to be called only
-// be insertType.
-//
-unsigned SlotCalculator::doInsertType(const Type *Ty) {
   // Insert into TypeMap.
-  unsigned DestSlot = TypeMap[Ty] = Types.size();
+  unsigned ResultSlot = TypeMap[Ty] = Types.size();
   Types.push_back(Ty);
-  SC_DEBUG("  Inserting type [" << DestSlot << "] = " << *Ty << "\n" );
-  return DestSlot;
+  SC_DEBUG("  Inserting type [" << ResultSlot << "] = " << *Ty << "\n" );
+  
+  // Loop over any contained types in the definition, ensuring they are also
+  // inserted.
+  for (Type::subtype_iterator I = Ty->subtype_begin(), E = Ty->subtype_end();
+       I != E; ++I)
+    getOrCreateTypeSlot(*I);
+
+  return ResultSlot;
 }
index 9223fb71f4286b72478edb7acc2bd6b221e5ce47..a8e221034035b7b18a51e777e98573220b1eb2e5 100644 (file)
@@ -107,9 +107,6 @@ private:
   void CreateSlotIfNeeded(const Value *V);
   unsigned getOrCreateTypeSlot(const Type *T);
 
-  // doInsertValue - Small helper function to be called only be insertVal.
-  unsigned doInsertType(const Type *T);
-
   // processModule - Process all of the module level function declarations and
   // types that are available.
   //