diff options
author | Reid Spencer <rspencer@reidspencer.com> | 2004-08-16 07:46:33 +0000 |
---|---|---|
committer | Reid Spencer <rspencer@reidspencer.com> | 2004-08-16 07:46:33 +0000 |
commit | b0ac8c48a66c3e44a374c7a3b29fd8be067e32cc (patch) | |
tree | 9d1b388e47cfa213e186268ff1c7b4b0b8133df1 /llvm/lib/VMCore | |
parent | 8fac94b8822a72fcae16d159b9fcd0ea560eb958 (diff) | |
download | bcm5719-llvm-b0ac8c48a66c3e44a374c7a3b29fd8be067e32cc.tar.gz bcm5719-llvm-b0ac8c48a66c3e44a374c7a3b29fd8be067e32cc.zip |
Fix PR422.
Ouch! Changes in the lazy initialization code caused each incorporated
function to reprocess the entire function on every lookup of a value's
slot number. This caused a horrible slowdown in all functions. This
fix made llvm-dis go from "longer than I care to wait" (minutes) on a large
test case to 0.53 seconds.
llvm-svn: 15818
Diffstat (limited to 'llvm/lib/VMCore')
-rw-r--r-- | llvm/lib/VMCore/AsmWriter.cpp | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/llvm/lib/VMCore/AsmWriter.cpp b/llvm/lib/VMCore/AsmWriter.cpp index 8f12f13baa4..4cfba7668f5 100644 --- a/llvm/lib/VMCore/AsmWriter.cpp +++ b/llvm/lib/VMCore/AsmWriter.cpp @@ -92,7 +92,10 @@ public: public: /// If you'd like to deal with a function instead of just a module, use /// this method to get its data into the SlotMachine. - void incorporateFunction(const Function *F) { TheFunction = F; } + void incorporateFunction(const Function *F) { + TheFunction = F; + FunctionProcessed = false; + } /// After calling incorporateFunction, use this method to remove the /// most recently incorporated function from the SlotMachine. This @@ -138,6 +141,7 @@ public: /// @brief The function for which we are holding slot numbers const Function* TheFunction; + bool FunctionProcessed; /// @brief The TypePlanes map for the module level data TypedPlanes mMap; @@ -1263,6 +1267,7 @@ CachedWriter& CachedWriter::operator<<(const Type &Ty) { SlotMachine::SlotMachine(const Module *M) : TheModule(M) ///< Saved for lazy initialization. , TheFunction(0) + , FunctionProcessed(false) , mMap() , mTypes() , fMap() @@ -1275,6 +1280,7 @@ SlotMachine::SlotMachine(const Module *M) SlotMachine::SlotMachine(const Function *F ) : TheModule( F ? F->getParent() : 0 ) ///< Saved for lazy initialization , TheFunction(F) ///< Saved for lazy initialization + , FunctionProcessed(false) , mMap() , mTypes() , fMap() @@ -1287,7 +1293,7 @@ inline void SlotMachine::initialize(void) { processModule(); TheModule = 0; ///< Prevent re-processing next time we're called. } - if ( TheFunction ) { + if ( TheFunction && ! FunctionProcessed) { processFunction(); } } @@ -1331,6 +1337,8 @@ void SlotMachine::processFunction() { } } + FunctionProcessed = true; + SC_DEBUG("end processFunction!\n"); } @@ -1343,6 +1351,7 @@ void SlotMachine::purgeFunction() { fMap.clear(); // Simply discard the function level map fTypes.clear(); TheFunction = 0; + FunctionProcessed = false; SC_DEBUG("end purgeFunction!\n"); } |