Since LLVM uses structure type equivalence, it isn't useful to keep around
authorChris Lattner <sabre@nondot.org>
Thu, 26 Feb 2004 20:02:23 +0000 (20:02 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 26 Feb 2004 20:02:23 +0000 (20:02 +0000)
multiple type names for the same structural type.  Make DTE eliminate all
but one of the type names

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

lib/Transforms/IPO/DeadTypeElimination.cpp

index 8849a025a0a312bf64328705f4cec3d8e70ccf47..c3a9f6edc5be46abd63c765c77b170733d09363e 100644 (file)
@@ -49,12 +49,12 @@ Pass *llvm::createDeadTypeEliminationPass() {
 // ShouldNukeSymtabEntry - Return true if this module level symbol table entry
 // should be eliminated.
 //
-static inline bool ShouldNukeSymtabEntry(const std::pair<std::string,Value*>&E){
+static inline bool ShouldNukeSymtabEntry(const Type *Ty){
   // Nuke all names for primitive types!
-  if (cast<Type>(E.second)->isPrimitiveType()) return true;
+  if (Ty->isPrimitiveType()) return true;
 
   // Nuke all pointers to primitive types as well...
-  if (const PointerType *PT = dyn_cast<PointerType>(E.second))
+  if (const PointerType *PT = dyn_cast<PointerType>(Ty))
     if (PT->getElementType()->isPrimitiveType()) return true;
 
   return false;
@@ -69,8 +69,7 @@ bool DTE::run(Module &M) {
   bool Changed = false;
 
   SymbolTable &ST = M.getSymbolTable();
-  const std::set<const Type *> &UsedTypes =
-    getAnalysis<FindUsedTypes>().getTypes();
+  std::set<const Type *> UsedTypes = getAnalysis<FindUsedTypes>().getTypes();
 
   // Check the symbol table for superfluous type entries...
   //
@@ -79,18 +78,20 @@ bool DTE::run(Module &M) {
   if (STI != ST.end()) {
     // Loop over all entries in the type plane...
     SymbolTable::VarMap &Plane = STI->second;
-    for (SymbolTable::VarMap::iterator PI = Plane.begin(); PI != Plane.end();)
+    for (SymbolTable::VarMap::iterator PI = Plane.begin(); PI != Plane.end();) {
       // If this entry should be unconditionally removed, or if we detect that
       // the type is not used, remove it.
-      if (ShouldNukeSymtabEntry(*PI) ||
-          !UsedTypes.count(cast<Type>(PI->second))) {
-        SymbolTable::VarMap::iterator PJ = PI++;
-        Plane.erase(PJ);
+      const Type *RHS = cast<Type>(PI->second);
+      if (ShouldNukeSymtabEntry(RHS) || !UsedTypes.count(RHS)) {
+        Plane.erase(PI++);
         ++NumKilled;
         Changed = true;
       } else {
         ++PI;
+        // We only need to leave one name for each type.
+        UsedTypes.erase(RHS);
       }
+    }
   }
 
   return Changed;