diff --git a/include/llvm/Analysis/IPModRef.h b/include/llvm/Analysis/IPModRef.h index fb0191e61f5..929b9b18797 100644 --- a/include/llvm/Analysis/IPModRef.h +++ b/include/llvm/Analysis/IPModRef.h @@ -41,13 +41,13 @@ #include "llvm/Pass.h" #include "Support/BitSetVector.h" -#include "Support/NonCopyable.h" class Module; class Function; class CallInst; class DSNode; class DSGraph; +class DSNodeHandle; class ModRefInfo; // Result of IP Mod/Ref for one entity class FunctionModRefInfo; // ModRefInfo for a func and all calls in it class IPModRef; // Pass that computes IP Mod/Ref info @@ -125,7 +125,8 @@ class FunctionModRefInfo { void computeModRef (const Function &func); void computeModRef (const CallInst& callInst); - DSGraph *ResolveCallSiteModRefInfo(const CallInst &CI); + DSGraph *ResolveCallSiteModRefInfo(const CallInst &CI, + std::map &NodeMap); public: /* ctor */ FunctionModRefInfo (const Function& func, diff --git a/lib/Analysis/DataStructure/IPModRef.cpp b/lib/Analysis/DataStructure/IPModRef.cpp index 9b33a3c27c8..0f9da425317 100644 --- a/lib/Analysis/DataStructure/IPModRef.cpp +++ b/lib/Analysis/DataStructure/IPModRef.cpp @@ -104,17 +104,28 @@ void FunctionModRefInfo::computeModRef(const Function &func) // 2. It clears all of the mod/ref bits in the cloned graph // 3. It then merges the bottom-up graph(s) for the specified call-site into // the clone (bringing new mod/ref bits). -// 4. It returns the clone. +// 4. It returns the clone, and a mapping of nodes from the original TDGraph to +// the cloned graph with Mod/Ref info for the callsite. // // NOTE: Because this clones a dsgraph and returns it, the caller is responsible // for deleting the returned graph! // -DSGraph *FunctionModRefInfo::ResolveCallSiteModRefInfo(const CallInst &CI) { - // Step #1: Clone the top-down graph... - DSGraph *Result = new DSGraph(funcTDGraph); +DSGraph *FunctionModRefInfo::ResolveCallSiteModRefInfo(const CallInst &CI, + std::map &NodeMap) { + + // Step #1: Clone the top-down graph... + std::map RawNodeMap; + DSGraph *Result = new DSGraph(funcTDGraph, RawNodeMap); + + // Convert the NodeMap from a map to DSNode* to be a map to DSNodeHandle's + NodeMap.insert(RawNodeMap.begin(), RawNodeMap.end()); + + // We are now done with the old map... so free it's memory... + RawNodeMap.clear(); + + // Step #2: Clear Mod/Ref information... + Result->maskNodeTypes(~(DSNode::Modified | DSNode::Read)); - //const Function &F = *CI.getParent()->getParent(); - //DSGraph &TDGraph = IPModRefObj.getAnalysis().getDSGraph(F); return Result; @@ -133,7 +144,8 @@ FunctionModRefInfo::computeModRef(const CallInst& callInst) callSiteModRefInfo[&callInst] = callModRefInfo; // Get a copy of the graph for the callee with the callee inlined - DSGraph* csgp = ResolveCallSiteModRefInfo(callInst); + std::map NodeMap; + DSGraph* csgp = ResolveCallSiteModRefInfo(callInst, NodeMap); // For all nodes in the graph, extract the mod/ref information const std::vector& csgNodes = csgp->getNodes(); diff --git a/lib/Analysis/IPA/IPModRef.cpp b/lib/Analysis/IPA/IPModRef.cpp index 9b33a3c27c8..0f9da425317 100644 --- a/lib/Analysis/IPA/IPModRef.cpp +++ b/lib/Analysis/IPA/IPModRef.cpp @@ -104,17 +104,28 @@ void FunctionModRefInfo::computeModRef(const Function &func) // 2. It clears all of the mod/ref bits in the cloned graph // 3. It then merges the bottom-up graph(s) for the specified call-site into // the clone (bringing new mod/ref bits). -// 4. It returns the clone. +// 4. It returns the clone, and a mapping of nodes from the original TDGraph to +// the cloned graph with Mod/Ref info for the callsite. // // NOTE: Because this clones a dsgraph and returns it, the caller is responsible // for deleting the returned graph! // -DSGraph *FunctionModRefInfo::ResolveCallSiteModRefInfo(const CallInst &CI) { - // Step #1: Clone the top-down graph... - DSGraph *Result = new DSGraph(funcTDGraph); +DSGraph *FunctionModRefInfo::ResolveCallSiteModRefInfo(const CallInst &CI, + std::map &NodeMap) { + + // Step #1: Clone the top-down graph... + std::map RawNodeMap; + DSGraph *Result = new DSGraph(funcTDGraph, RawNodeMap); + + // Convert the NodeMap from a map to DSNode* to be a map to DSNodeHandle's + NodeMap.insert(RawNodeMap.begin(), RawNodeMap.end()); + + // We are now done with the old map... so free it's memory... + RawNodeMap.clear(); + + // Step #2: Clear Mod/Ref information... + Result->maskNodeTypes(~(DSNode::Modified | DSNode::Read)); - //const Function &F = *CI.getParent()->getParent(); - //DSGraph &TDGraph = IPModRefObj.getAnalysis().getDSGraph(F); return Result; @@ -133,7 +144,8 @@ FunctionModRefInfo::computeModRef(const CallInst& callInst) callSiteModRefInfo[&callInst] = callModRefInfo; // Get a copy of the graph for the callee with the callee inlined - DSGraph* csgp = ResolveCallSiteModRefInfo(callInst); + std::map NodeMap; + DSGraph* csgp = ResolveCallSiteModRefInfo(callInst, NodeMap); // For all nodes in the graph, extract the mod/ref information const std::vector& csgNodes = csgp->getNodes();