[llvm-commits] CVS: llvm/lib/AsmParser/llvmAsmParser.y

Chris Lattner lattner at cs.uiuc.edu
Mon Feb 9 12:55:03 PST 2004


Changes in directory llvm/lib/AsmParser:

llvmAsmParser.y updated: 1.154 -> 1.155

---
Log message:

When resolving upreferences, if multiple uprefs will be resolved to the same
type at the same time, resolve the upreferences to each other before resolving
it to the outer type.  This shaves off some time from the testcase in PR224, from
25.41s -> 21.72s.


---
Diffs of the changes:  (+24 -6)

Index: llvm/lib/AsmParser/llvmAsmParser.y
diff -u llvm/lib/AsmParser/llvmAsmParser.y:1.154 llvm/lib/AsmParser/llvmAsmParser.y:1.155
--- llvm/lib/AsmParser/llvmAsmParser.y:1.154	Sun Feb  8 22:37:27 2004
+++ llvm/lib/AsmParser/llvmAsmParser.y	Mon Feb  9 12:53:54 2004
@@ -626,6 +626,13 @@
   UR_OUT("Type '" << Ty->getDescription() << 
          "' newly formed.  Resolving upreferences.\n" <<
          UpRefs.size() << " upreferences active!\n");
+
+  // If we find any resolvable upreferences (i.e., those whose NestingLevel goes
+  // to zero), we resolve them all together before we resolve them to Ty.  At
+  // the end of the loop, if there is anything to resolve to Ty, it will be in
+  // this variable.
+  OpaqueType *TypeToResolve = 0;
+
   for (unsigned i = 0; i != UpRefs.size(); ++i) {
     UR_OUT("  UR#" << i << " - TypeContains(" << Ty->getDescription() << ", " 
 	   << UpRefs[i].second->getDescription() << ") = " 
@@ -636,16 +643,27 @@
       UpRefs[i].LastContainedTy = Ty;
       UR_OUT("  Uplevel Ref Level = " << Level << "\n");
       if (Level == 0) {                     // Upreference should be resolved! 
-	UR_OUT("  * Resolving upreference for "
-               << UpRefs[i].second->getDescription() << "\n";
-	       std::string OldName = UpRefs[i].UpRefTy->getDescription());
-	UpRefs[i].UpRefTy->refineAbstractTypeTo(Ty);
-	UR_OUT("  * Type '" << OldName << "' refined upreference to: "
-	       << (const void*)Ty << ", " << Ty->getDescription() << "\n");
+        if (!TypeToResolve) {
+          TypeToResolve = UpRefs[i].UpRefTy;
+        } else {
+          UR_OUT("  * Resolving upreference for "
+                 << UpRefs[i].second->getDescription() << "\n";
+                 std::string OldName = UpRefs[i].UpRefTy->getDescription());
+          UpRefs[i].UpRefTy->refineAbstractTypeTo(TypeToResolve);
+          UR_OUT("  * Type '" << OldName << "' refined upreference to: "
+                 << (const void*)Ty << ", " << Ty->getDescription() << "\n");
+        }
 	UpRefs.erase(UpRefs.begin()+i);     // Remove from upreference list...
         --i;                                // Do not skip the next element...
       }
     }
+  }
+
+  if (TypeToResolve) {
+    UR_OUT("  * Resolving upreference for "
+           << UpRefs[i].second->getDescription() << "\n";
+           std::string OldName = UpRefs[i].UpRefTy->getDescription());
+    TypeToResolve->refineAbstractTypeTo(Ty);
   }
 
   return Ty;





More information about the llvm-commits mailing list