Fix a heinous inefficiency introduced in r149918, wherein reading each byte of a
authorChris Lattner <sabre@nondot.org>
Mon, 21 Jan 2013 18:24:49 +0000 (18:24 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 21 Jan 2013 18:24:49 +0000 (18:24 +0000)
BLOB (i.e., large, performance intensive data) in a bitcode file was switched to
invoking one virtual method call per byte read.  Now we do one virtual call per
BLOB.

llvm-svn: 173065

llvm/include/llvm/Bitcode/BitstreamReader.h
llvm/lib/Bitcode/Reader/BitstreamReader.cpp

index 16f9686..c143886 100644 (file)
@@ -237,12 +237,6 @@ public:
         static_cast<uint64_t>(pos - 1));
   }
 
-  unsigned char getByte(size_t pos) {
-    uint8_t byte = -1;
-    BitStream->getBitcodeBytes().readByte(pos, &byte);
-    return byte;
-  }
-
   uint32_t getWord(size_t pos) {
     uint8_t buf[4] = { 0xFF, 0xFF, 0xFF, 0xFF };
     BitStream->getBitcodeBytes().readBytes(pos, sizeof(buf), buf, NULL);
index 92133bb..7984512 100644 (file)
@@ -255,18 +255,17 @@ unsigned BitstreamCursor::readRecord(unsigned AbbrevID,
       break;
     }
     
-    // Otherwise, read the number of bytes.  If we can return a reference to
-    // the data, do so to avoid copying it.
+    // Otherwise, inform the streamer that we need these bytes in memory.
+    const char *Ptr = (const char*)
+      BitStream->getBitcodeBytes().getPointer(CurBitPos/8, NumElts);
+    
+    // If we can return a reference to the data, do so to avoid copying it.
     if (Blob) {
-      *Blob =
-        StringRef((const char*)BitStream->getBitcodeBytes().getPointer(
-                                                          CurBitPos/8, NumElts),
-                  NumElts);
+      *Blob = StringRef(Ptr, NumElts);
     } else {
-      // FIXME: This is a brutally inefficient way to do this.  Why isn't this
-      // just using getPointer?      
+      // Otherwise, unpack into Vals with zero extension.
       for (; NumElts; --NumElts)
-        Vals.push_back(Read(8));
+        Vals.push_back((unsigned char)*Ptr++);
     }
     // Skip over tail padding.
     JumpToBit(NewEnd);