aboutsummaryrefslogtreecommitdiffstats
path: root/lib/VMCore/AsmWriter.cpp
diff options
context:
space:
mode:
authorReid Spencer <rspencer@reidspencer.com>2004-08-16 07:46:33 +0000
committerReid Spencer <rspencer@reidspencer.com>2004-08-16 07:46:33 +0000
commit28531c71cd142f623d56a7ea13df2e014eebff54 (patch)
tree6ee3aaa75133c190ec8cac98f6e294ab8d3d4a0d /lib/VMCore/AsmWriter.cpp
parentd771c5340aa281c35d22e207b6321b52246639a2 (diff)
downloadexternal_llvm-28531c71cd142f623d56a7ea13df2e014eebff54.zip
external_llvm-28531c71cd142f623d56a7ea13df2e014eebff54.tar.gz
external_llvm-28531c71cd142f623d56a7ea13df2e014eebff54.tar.bz2
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15818 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore/AsmWriter.cpp')
-rw-r--r--lib/VMCore/AsmWriter.cpp13
1 files changed, 11 insertions, 2 deletions
diff --git a/lib/VMCore/AsmWriter.cpp b/lib/VMCore/AsmWriter.cpp
index 8f12f13..4cfba76 100644
--- a/lib/VMCore/AsmWriter.cpp
+++ b/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");
}