[llvm-commits] CVS: llvm-poolalloc/lib/PoolAllocate/PointerCompress.cpp
Chris Lattner
lattner at cs.uiuc.edu
Fri Mar 4 18:48:18 PST 2005
Changes in directory llvm-poolalloc/lib/PoolAllocate:
PointerCompress.cpp updated: 1.48 -> 1.49
---
Log message:
traverse the call graph from bottom up.
---
Diffs of the changes: (+23 -6)
PointerCompress.cpp | 29 +++++++++++++++++++++++------
1 files changed, 23 insertions(+), 6 deletions(-)
Index: llvm-poolalloc/lib/PoolAllocate/PointerCompress.cpp
diff -u llvm-poolalloc/lib/PoolAllocate/PointerCompress.cpp:1.48 llvm-poolalloc/lib/PoolAllocate/PointerCompress.cpp:1.49
--- llvm-poolalloc/lib/PoolAllocate/PointerCompress.cpp:1.48 Fri Mar 4 20:11:16 2005
+++ llvm-poolalloc/lib/PoolAllocate/PointerCompress.cpp Fri Mar 4 20:48:05 2005
@@ -111,6 +111,11 @@
Function *PoolInitPC, *PoolDestroyPC, *PoolAllocPC;
typedef std::map<const DSNode*, CompressedPoolInfo> PoolInfoMap;
+ /// NoArgFunctionsCalled - When we are walking the call graph, keep track of
+ /// which functions are called that don't need their prototype to be
+ /// changed.
+ std::vector<Function*> NoArgFunctionsCalled;
+
bool runOnModule(Module &M);
void HandleGlobalPools(Module &M);
@@ -904,8 +909,10 @@
Operands.push_back(CI.getOperand(i));
}
- if (CompressedArgs.empty())
+ if (CompressedArgs.empty()) {
+ PtrComp.NoArgFunctionsCalled.push_back(Callee);
return; // Nothing to compress!
+ }
Function *Clone = PtrComp.GetExtFunctionClone(Callee, CompressedArgs);
Value *NC = new CallInst(Clone, Operands, CI.getName(), &CI);
@@ -1394,16 +1401,26 @@
// Handle all pools pointed to by global variables.
HandleGlobalPools(M);
+ std::set<Function*> TransformedFns;
+
// Iterate over all functions in the module, looking for compressible data
// structures.
bool Changed = false;
- for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) {
- // If this function is not a pointer-compressed clone, compress any pools in
- // it now.
- if (!ClonedFunctionInfoMap.count(I))
+ for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
+ // If this function is not a pointer-compressed or pool allocated clone,
+ // compress any pools in it now.
+ if (I->hasExternalLinkage()) {
Changed |= CompressPoolsInFunction(*I);
- }
+ TransformedFns.insert(I);
+ }
+
+ // If compressing external functions (e.g. main), required other function
+ // bodies to be compressed that do not take pool arguments, handle them now.
+ for (unsigned i = 0; i != NoArgFunctionsCalled.size(); ++i)
+ if (TransformedFns.insert(NoArgFunctionsCalled[i]).second)
+ Changed |= CompressPoolsInFunction(*NoArgFunctionsCalled[i]);
+ NoArgFunctionsCalled.clear();
ClonedFunctionMap.clear();
return Changed;
}
More information about the llvm-commits
mailing list