Change the table datastructure to be a vector<smallvector>, instead of
authorChris Lattner <sabre@nondot.org>
Sat, 10 Feb 2007 07:42:59 +0000 (07:42 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 10 Feb 2007 07:42:59 +0000 (07:42 +0000)
vector<vector> to avoid allocations.  This speeds up bcwriting of 447.dealII
from 0.8276 to 0.7637s (8.4%).

This concludes this round of proding the bcwriter into submission.  Final
speedup from 24.4s to 0.7637s (32x).

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

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

index a7722e893f0faa2c95cfc8ad04119a65fd357f10..d457c6c8a79048eac0d20b165cdd3da898c76435 100644 (file)
@@ -21,6 +21,7 @@
 #define LLVM_ANALYSIS_SLOTCALCULATOR_H
 
 #include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/SmallVector.h"
 #include <vector>
 
 namespace llvm {
@@ -44,9 +45,10 @@ struct ModuleLevelDenseMapKeyInfo {
 
 class SlotCalculator {
   const Module *TheModule;
-
+public:
   typedef std::vector<const Type*> TypeList;
-  typedef std::vector<const Value*> TypePlane;
+  typedef SmallVector<const Value*, 16> TypePlane;
+private:
   std::vector<TypePlane> Table;
   TypeList Types;
   typedef DenseMap<const Value*, unsigned> NodeMapType;
index df62bf934ba83c0c8839f02b8cb0e496947ad720..b98604bf7196b9c3d9c76f59c9157e75d7a1f7a7 100644 (file)
@@ -812,21 +812,22 @@ void BytecodeWriter::outputTypes(unsigned TypeNum) {
 // Helper function for outputConstants().
 // Writes out all the constants in the plane Plane starting at entry StartNo.
 //
-void BytecodeWriter::outputConstantsInPlane(const std::vector<const Value*>
-                                            &Plane, unsigned StartNo) {
+void BytecodeWriter::outputConstantsInPlane(const Value *const *Plane,
+                                            unsigned PlaneSize,
+                                            unsigned StartNo) {
   unsigned ValNo = StartNo;
 
   // Scan through and ignore function arguments, global values, and constant
   // strings.
-  for (; ValNo < Plane.size() &&
+  for (; ValNo < PlaneSize &&
          (isa<Argument>(Plane[ValNo]) || isa<GlobalValue>(Plane[ValNo]) ||
           (isa<ConstantArray>(Plane[ValNo]) &&
            cast<ConstantArray>(Plane[ValNo])->isString())); ValNo++)
     /*empty*/;
 
   unsigned NC = ValNo;              // Number of constants
-  for (; NC < Plane.size() && (isa<Constant>(Plane[NC]) || 
-                               isa<InlineAsm>(Plane[NC])); NC++)
+  for (; NC < PlaneSize && (isa<Constant>(Plane[NC]) || 
+                              isa<InlineAsm>(Plane[NC])); NC++)
     /*empty*/;
   NC -= ValNo;                      // Convert from index into count
   if (NC == 0) return;              // Skip empty type planes...
@@ -839,7 +840,7 @@ void BytecodeWriter::outputConstantsInPlane(const std::vector<const Value*>
   output_vbr(NC);
 
   // Put out the Type ID Number.
-  output_typeid(Table.getTypeSlot(Plane.front()->getType()));
+  output_typeid(Table.getTypeSlot(Plane[0]->getType()));
 
   for (unsigned i = ValNo; i < ValNo+NC; ++i) {
     const Value *V = Plane[i];
@@ -864,7 +865,7 @@ void BytecodeWriter::outputConstants() {
   outputConstantStrings();
 
   for (unsigned pno = 0; pno != NumPlanes; pno++) {
-    const std::vector<const Value*> &Plane = Table.getPlane(pno);
+    const SlotCalculator::TypePlane &Plane = Table.getPlane(pno);
     if (!Plane.empty()) {              // Skip empty type planes...
       unsigned ValNo = 0;
       if (hasNullValue(Plane[0]->getType())) {
@@ -873,7 +874,7 @@ void BytecodeWriter::outputConstants() {
       }
 
       // Write out constants in the plane
-      outputConstantsInPlane(Plane, ValNo);
+      outputConstantsInPlane(&Plane[0], Plane.size(), ValNo);
     }
   }
 }
index 116791e62986d113388815c43dd02b4a4d1e1a0d..6a036d804a911ee5cf3569b8fd81ea5af253399f 100644 (file)
@@ -35,11 +35,6 @@ private:
   void outputConstants();
   void outputConstantStrings();
   void outputFunction(const Function *F);
-  void outputCompactionTable();
-  void outputCompactionTypes(unsigned StartNo);
-  void outputCompactionTablePlane(unsigned PlaneNo,
-                                  const std::vector<const Value*> &TypePlane,
-                                  unsigned StartNo);
   void outputInstructions(const Function *F);
   void outputInstruction(const Instruction &I);
   void outputInstructionFormat0(const Instruction *I, unsigned Opcode,
@@ -66,7 +61,7 @@ private:
   void outputTypeSymbolTable(const TypeSymbolTable &TST);
   void outputValueSymbolTable(const ValueSymbolTable &ST);
   void outputTypes(unsigned StartNo);
-  void outputConstantsInPlane(const std::vector<const Value*> &Plane,
+  void outputConstantsInPlane(const Value *const*Plane, unsigned PlaneSize,
                               unsigned StartNo);
   void outputConstant(const Constant *CPV);
   void outputInlineAsm(const InlineAsm *IA);