mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-29 14:40:25 +00:00
Allow the ResolveCallSiteModRefInfo method to return a mapping of nodes,
implement the mod/ref bit masking git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4578 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
268748a0d8
commit
4476ceb414
@ -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<const DSNode*, DSNodeHandle> &NodeMap);
|
||||
|
||||
public:
|
||||
/* ctor */ FunctionModRefInfo (const Function& func,
|
||||
|
@ -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<const DSNode*, DSNodeHandle> &NodeMap) {
|
||||
|
||||
// Step #1: Clone the top-down graph...
|
||||
std::map<const DSNode*, DSNode*> 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<TDDataStructures>().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<const DSNode*, DSNodeHandle> NodeMap;
|
||||
DSGraph* csgp = ResolveCallSiteModRefInfo(callInst, NodeMap);
|
||||
|
||||
// For all nodes in the graph, extract the mod/ref information
|
||||
const std::vector<DSNode*>& csgNodes = csgp->getNodes();
|
||||
|
@ -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<const DSNode*, DSNodeHandle> &NodeMap) {
|
||||
|
||||
// Step #1: Clone the top-down graph...
|
||||
std::map<const DSNode*, DSNode*> 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<TDDataStructures>().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<const DSNode*, DSNodeHandle> NodeMap;
|
||||
DSGraph* csgp = ResolveCallSiteModRefInfo(callInst, NodeMap);
|
||||
|
||||
// For all nodes in the graph, extract the mod/ref information
|
||||
const std::vector<DSNode*>& csgNodes = csgp->getNodes();
|
||||
|
Loading…
Reference in New Issue
Block a user