Changes in directory llvm/lib/Bytecode/Writer:
SlotCalculator.cpp updated: 1.105 -> 1.106 SlotCalculator.h updated: 1.45 -> 1.46 --- Log message: The ModuleLevel vector is often quite sparse. Switch it to a DenseMap. This speeds up bcwriting of 447.dealII by 40%, from 4.63s to 3.32s. --- Diffs of the changes: (+24 -18) SlotCalculator.cpp | 29 +++++++++++++---------------- SlotCalculator.h | 13 +++++++++++-- 2 files changed, 24 insertions(+), 18 deletions(-) Index: llvm/lib/Bytecode/Writer/SlotCalculator.cpp diff -u llvm/lib/Bytecode/Writer/SlotCalculator.cpp:1.105 llvm/lib/Bytecode/Writer/SlotCalculator.cpp:1.106 --- llvm/lib/Bytecode/Writer/SlotCalculator.cpp:1.105 Sat Feb 10 00:09:41 2007 +++ llvm/lib/Bytecode/Writer/SlotCalculator.cpp Sat Feb 10 00:38:19 2007 @@ -179,11 +179,9 @@ ++FirstNonValueTypeID; } } - - - // Initialize the ModuleLevel entries. - ModuleLevel.resize(getNumPlanes(), -1); + NumModuleTypes = getNumPlanes(); + SC_DEBUG("end processModule!\n"); } @@ -300,27 +298,26 @@ } void SlotCalculator::purgeFunction() { - unsigned NumModuleTypes = ModuleLevel.size(); - SC_DEBUG("begin purgeFunction!\n"); // Next, remove values from existing type planes - for (unsigned i = 0; i != NumModuleTypes; ++i) { - // If this type is not used by this function, ignore it. - int ModuleLev = ModuleLevel[i]; - if (ModuleLev == -1) continue; + for (DenseMap<unsigned,unsigned, + ModuleLevelDenseMapKeyInfo>::iterator I = ModuleLevel.begin(), + E = ModuleLevel.end(); I != E; ++I) { + unsigned PlaneNo = I->first; + unsigned ModuleLev = I->second; - ModuleLevel[i] = -1; // Reset for next function. - // Pop all function-local values in this type-plane off of Table. - TypePlane &Plane = getPlane(i); + TypePlane &Plane = getPlane(PlaneNo); assert(ModuleLev < Plane.size() && "module levels higher than elements?"); for (unsigned i = ModuleLev, e = Plane.size(); i != e; ++i) { NodeMap.erase(Plane.back()); // Erase from nodemap Plane.pop_back(); // Shrink plane } } - + + ModuleLevel.clear(); + // Finally, remove any type planes defined by the function... while (Table.size() > NumModuleTypes) { TypePlane &Plane = Table.back(); @@ -349,8 +346,8 @@ // If this is the first value noticed of this type within this function, // remember the module level for this type plane in ModuleLevel. This reminds // us to remove the values in purgeFunction and tells us how many to remove. - if (TyPlane < ModuleLevel.size() && ModuleLevel[TyPlane] == -1) - ModuleLevel[TyPlane] = Table[TyPlane].size(); + if (TyPlane < NumModuleTypes) + ModuleLevel.insert(std::make_pair(TyPlane, Table[TyPlane].size())); // If this is the first value to get inserted into the type plane, make sure // to insert the implicit null value. Index: llvm/lib/Bytecode/Writer/SlotCalculator.h diff -u llvm/lib/Bytecode/Writer/SlotCalculator.h:1.45 llvm/lib/Bytecode/Writer/SlotCalculator.h:1.46 --- llvm/lib/Bytecode/Writer/SlotCalculator.h:1.45 Sat Feb 10 00:09:41 2007 +++ llvm/lib/Bytecode/Writer/SlotCalculator.h Sat Feb 10 00:38:19 2007 @@ -20,6 +20,7 @@ #ifndef LLVM_ANALYSIS_SLOTCALCULATOR_H #define LLVM_ANALYSIS_SLOTCALCULATOR_H +#include "llvm/ADT/DenseMap.h" #include <vector> #include <map> @@ -34,6 +35,14 @@ class ValueSymbolTable; class ConstantArray; +struct ModuleLevelDenseMapKeyInfo { + static inline unsigned getEmptyKey() { return ~0U; } + static inline unsigned getTombstoneKey() { return ~1U; } + static unsigned getHashValue(unsigned Val) { return Val ^ Val >> 4; } + static bool isPod() { return true; } +}; + + class SlotCalculator { const Module *TheModule; @@ -54,8 +63,8 @@ /// ModuleLevel - Used to keep track of which values belong to the module, /// and which values belong to the currently incorporated function. /// - std::vector<int> ModuleLevel; - unsigned ModuleTypeLevel; + DenseMap<unsigned,unsigned,ModuleLevelDenseMapKeyInfo> ModuleLevel; + unsigned NumModuleTypes; SlotCalculator(const SlotCalculator &); // DO NOT IMPLEMENT void operator=(const SlotCalculator &); // DO NOT IMPLEMENT _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits