Changes in directory llvm-poolalloc/lib/PoolAllocate:
PoolAllocate.cpp updated: 1.123 -> 1.124 PoolAllocate.h updated: 1.49 -> 1.50 TransformFunctionBody.cpp updated: 1.52 -> 1.53 --- Log message: add an option to use the td graph to resolve unresolved call sites. Also always check the BU DSNode for info if the callgraph fails us. --- Diffs of the changes: (+49 -5) PoolAllocate.cpp | 11 +++++++++++ PoolAllocate.h | 2 ++ TransformFunctionBody.cpp | 41 ++++++++++++++++++++++++++++++++++++----- 3 files changed, 49 insertions(+), 5 deletions(-) Index: llvm-poolalloc/lib/PoolAllocate/PoolAllocate.cpp diff -u llvm-poolalloc/lib/PoolAllocate/PoolAllocate.cpp:1.123 llvm-poolalloc/lib/PoolAllocate/PoolAllocate.cpp:1.124 --- llvm-poolalloc/lib/PoolAllocate/PoolAllocate.cpp:1.123 Wed Jan 25 16:07:36 2006 +++ llvm-poolalloc/lib/PoolAllocate/PoolAllocate.cpp Mon Jun 19 09:55:28 2006 @@ -26,6 +26,7 @@ #include "llvm/Target/TargetData.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h" #include "llvm/Transforms/Utils/Cloning.h" +#include "llvm/Analysis/DataStructure/CallTargets.h" #include "llvm/ADT/DepthFirstIterator.h" #include "llvm/ADT/Statistic.h" #include "llvm/ADT/STLExtras.h" @@ -76,6 +77,10 @@ cl::opt<bool> DisablePoolFreeOpt("poolalloc-force-all-poolfrees", cl::desc("Do not try to elide poolfree's where possible")); + + cl::opt<bool> + UseTDResolve("poolalloc-usetd-resolve", + cl::desc("Use Top-Down Graph as a resolve source")); } void PoolAllocate::getAnalysisUsage(AnalysisUsage &AU) const { @@ -93,6 +98,8 @@ AU.setPreservesAll(); #endif AU.addRequired<TargetData>(); + if (UseTDResolve) + AU.addRequired<CallTargetFinder>(); } bool PoolAllocate::runOnModule(Module &M) { @@ -102,6 +109,10 @@ #endif CurModule = &M; ECGraphs = &getAnalysis<EquivClassGraphs>(); // folded inlined CBU graphs + if (UseTDResolve) + CTF = &getAnalysis<CallTargetFinder>(); + else + CTF = 0; CurHeuristic = Heuristic::create(); CurHeuristic->Initialize(M, ECGraphs->getGlobalsGraph(), *this); Index: llvm-poolalloc/lib/PoolAllocate/PoolAllocate.h diff -u llvm-poolalloc/lib/PoolAllocate/PoolAllocate.h:1.49 llvm-poolalloc/lib/PoolAllocate/PoolAllocate.h:1.50 --- llvm-poolalloc/lib/PoolAllocate/PoolAllocate.h:1.49 Wed Jun 14 16:17:32 2006 +++ llvm-poolalloc/lib/PoolAllocate/PoolAllocate.h Mon Jun 19 09:55:28 2006 @@ -43,6 +43,7 @@ class Type; class AllocaInst; class EquivClassGraphs; +class CallTargetFinder; namespace PA { @@ -122,6 +123,7 @@ Module *CurModule; EquivClassGraphs *ECGraphs; + CallTargetFinder* CTF; std::map<Function*, PA::FuncInfo> FunctionInfo; std::map<Function*, Function*> CloneToOrigMap; Index: llvm-poolalloc/lib/PoolAllocate/TransformFunctionBody.cpp diff -u llvm-poolalloc/lib/PoolAllocate/TransformFunctionBody.cpp:1.52 llvm-poolalloc/lib/PoolAllocate/TransformFunctionBody.cpp:1.53 --- llvm-poolalloc/lib/PoolAllocate/TransformFunctionBody.cpp:1.52 Thu Apr 13 09:07:35 2006 +++ llvm-poolalloc/lib/PoolAllocate/TransformFunctionBody.cpp Mon Jun 19 09:55:28 2006 @@ -15,6 +15,7 @@ #include "PoolAllocate.h" #include "llvm/Analysis/DataStructure/DataStructure.h" #include "llvm/Analysis/DataStructure/DSGraph.h" +#include "llvm/Analysis/DataStructure/CallTargets.h" #include "llvm/Module.h" #include "llvm/DerivedTypes.h" #include "llvm/Constants.h" @@ -34,6 +35,7 @@ PoolAllocate &PAInfo; DSGraph &G; // The Bottom-up DS Graph FuncInfo &FI; + CallTargetFinder* CTF; // PoolUses - For each pool (identified by the pool descriptor) keep track // of which blocks require the memory in the pool to not be freed. This @@ -47,8 +49,9 @@ FuncTransform(PoolAllocate &P, DSGraph &g, FuncInfo &fi, std::multimap<AllocaInst*, Instruction*> &poolUses, - std::multimap<AllocaInst*, CallInst*> &poolFrees) - : PAInfo(P), G(g), FI(fi), + std::multimap<AllocaInst*, CallInst*> &poolFrees, + CallTargetFinder* ctf) + : PAInfo(P), G(g), FI(fi), CTF(ctf), PoolUses(poolUses), PoolFrees(poolFrees) { } @@ -115,7 +118,7 @@ std::multimap<AllocaInst*,Instruction*> &poolUses, std::multimap<AllocaInst*, CallInst*> &poolFrees, Function &F) { - FuncTransform(*this, g, fi, poolUses, poolFrees).visit(F); + FuncTransform(*this, g, fi, poolUses, poolFrees, CTF).visit(F); } @@ -519,11 +522,39 @@ CF = I->second; break; } - + + // If we didn't find the callee in the constructed call graph, try + // checking in the DSNode itself. + // This isn't ideal as it means that this call site didn't have inlining + // happen. + if (!CF) { + DSGraph* dg = &ECGraphs.getDSGraph(*OrigInst->getParent()->getParent()); + DSNode* d = dg->getNodeForValue(OrigInst->getOperand(0)).getNode(); + const std::vector<GlobalValue*> &g = d->getGlobalsList(); + for(std::vector<GlobalValue*>::const_iterator ii = g.begin(), ee = g.end(); + !CF && ii != ee; ++ii) { + EquivalenceClasses< GlobalValue *> & EC = ECGraphs.getGlobalECs(); + for (EquivalenceClasses<GlobalValue *>::member_iterator MI = EC.findLeader(*ii); + MI != EC.member_end(); ++MI) // Loop over members in this set. + if ((CF = dyn_cast<Function>(*MI))) { + std::cerr << "\n***\nPA: *** WARNING (FuncTransform::visitCallSite): " + << "Using DSNode for callees for call-site in function " + << CS.getCaller()->getName() << "\n***\n"; + break; + } + } + } + + if (!CF && CTF) { + std::cerr << "\nPA: Last Resort TD Indirect Resolve in " << CS.getCaller()->getName() << "\n"; + CF = *CTF->begin(isa<CallInst>(OrigInst)?CallSite(cast<CallInst>(OrigInst)) + :CallSite(cast<InvokeInst>(OrigInst))); + if (CF) std::cerr << "TD resolved to " << CF->getName() << "\n"; + } if (!CF) { // FIXME: Unknown callees for a call-site. Warn and ignore. - std::cerr << "\n***\n*** WARNING (FuncTransform::visitCallSite): " + std::cerr << "\n***\nPA: *** WARNING (FuncTransform::visitCallSite): " << "Unknown callees for call-site in function " << CS.getCaller()->getName() << "\n***\n"; return; _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits