Remove potentially N^2 algorithm from symbol table reader. No speedup
authorChris Lattner <sabre@nondot.org>
Thu, 9 Oct 2003 20:30:04 +0000 (20:30 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 9 Oct 2003 20:30:04 +0000 (20:30 +0000)
in practice though

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

lib/Bytecode/Reader/Reader.cpp

index e649cdc08f142e6e14d4c6b23d1fdb0981a413aa..c515c1575c52f7cd50f0dfd2fc563dc0eb885ef5 100644 (file)
@@ -219,6 +219,9 @@ void BytecodeParser::ParseSymbolTable(const unsigned char *&Buf,
     BCR_TRACE(3, "Plane Type: '" << *Ty << "' with " << NumEntries <<
                  " entries\n");
 
+    Function::iterator BlockIterator;
+    unsigned CurBlockIteratorIdx = ~0;
+
     for (unsigned i = 0; i < NumEntries; ++i) {
       // Symtab entry: [def slot #][name]
       unsigned slot;
@@ -231,12 +234,17 @@ void BytecodeParser::ParseSymbolTable(const unsigned char *&Buf,
       if (Typ == Type::TypeTyID)
         V = (Value*)getType(slot);
       else if (Typ == Type::LabelTyID) {
-        if (CurrentFunction) {
-          // FIXME: THIS IS N^2!!!
-          Function::iterator BlockIterator = CurrentFunction->begin();
-          std::advance(BlockIterator, slot);
-          V = BlockIterator;
+        if (!CurrentFunction)
+          throw std::string("Basic blocks don't exist at global scope!");
+
+        if (slot < CurBlockIteratorIdx) {
+          CurBlockIteratorIdx = 0;
+          BlockIterator = CurrentFunction->begin();
         }
+
+        std::advance(BlockIterator, slot-CurBlockIteratorIdx);
+        CurBlockIteratorIdx = slot;
+        V = BlockIterator;
       } else
         V = getValue(Typ, slot, false); // Find mapping...
       if (V == 0) throw std::string("Failed value look-up.");