diff options
| -rw-r--r-- | llvm/include/llvm/Analysis/IPModRef.h | 1 | ||||
| -rw-r--r-- | llvm/lib/Analysis/IPA/IPModRef.cpp | 35 | 
2 files changed, 24 insertions, 12 deletions
diff --git a/llvm/include/llvm/Analysis/IPModRef.h b/llvm/include/llvm/Analysis/IPModRef.h index 290ae58fe36..fb0191e61f5 100644 --- a/llvm/include/llvm/Analysis/IPModRef.h +++ b/llvm/include/llvm/Analysis/IPModRef.h @@ -125,6 +125,7 @@ class FunctionModRefInfo {    void          computeModRef   (const Function &func);    void          computeModRef   (const CallInst& callInst); +  DSGraph *ResolveCallSiteModRefInfo(const CallInst &CI);  public:    /* ctor */    FunctionModRefInfo      (const Function& func, diff --git a/llvm/lib/Analysis/IPA/IPModRef.cpp b/llvm/lib/Analysis/IPA/IPModRef.cpp index c32f4425cfa..9b33a3c27c8 100644 --- a/llvm/lib/Analysis/IPA/IPModRef.cpp +++ b/llvm/lib/Analysis/IPA/IPModRef.cpp @@ -74,16 +74,6 @@ unsigned FunctionModRefInfo::getNodeId(const Value* value) const { -// Dummy function that will be replaced with one that inlines -// the callee's BU graph into the caller's TD graph. -//  -static const DSGraph* ResolveGraphForCallSite(const DSGraph& funcTDGraph, -                                       const CallInst& callInst) -{ -  return &funcTDGraph;                    // TEMPORARY -} - -  // Compute Mod/Ref bit vectors for the entire function.  // These are simply copies of the Read/Write flags from the nodes of  // the top-down DS graph. @@ -108,6 +98,27 @@ void FunctionModRefInfo::computeModRef(const Function &func)      computeModRef(callSites[i].getCallInst());  } +// ResolveCallSiteModRefInfo - This method performs the following actions: +// +//  1. It clones the top-down graph for the current function +//  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. +// +// 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); + +  //const Function &F = *CI.getParent()->getParent(); +  //DSGraph &TDGraph = IPModRefObj.getAnalysis<TDDataStructures>().getDSGraph(F); + +   +  return Result; +}  // Compute Mod/Ref bit vectors for a single call site.  // These are copies of the Read/Write flags from the nodes of @@ -122,8 +133,7 @@ FunctionModRefInfo::computeModRef(const CallInst& callInst)    callSiteModRefInfo[&callInst] = callModRefInfo;    // Get a copy of the graph for the callee with the callee inlined -  const DSGraph* csgp = ResolveGraphForCallSite(funcTDGraph, callInst); -  assert(csgp && "Unable to compute callee mod/ref information"); +  DSGraph* csgp = ResolveCallSiteModRefInfo(callInst);    // For all nodes in the graph, extract the mod/ref information    const std::vector<DSNode*>& csgNodes = csgp->getNodes(); @@ -136,6 +146,7 @@ FunctionModRefInfo::computeModRef(const CallInst& callInst)        if (csgNodes[i]->isRead())          callModRefInfo->setNodeIsRef(getNodeId(origNodes[i]));      } +  delete csgp;  }  | 

