aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/Analysis/IPModRef.h46
1 files changed, 15 insertions, 31 deletions
diff --git a/include/llvm/Analysis/IPModRef.h b/include/llvm/Analysis/IPModRef.h
index aa6c308fb2..5a08dc02e7 100644
--- a/include/llvm/Analysis/IPModRef.h
+++ b/include/llvm/Analysis/IPModRef.h
@@ -33,15 +33,12 @@
// class IPModRef is primarily meant for other analysis passes that need to
// use Mod/Ref information efficiently for more complicated purposes;
// the bit-vector representations make propagation very efficient.
+//
//===----------------------------------------------------------------------===//
-
#ifndef LLVM_ANALYSIS_IPMODREF_H
#define LLVM_ANALYSIS_IPMODREF_H
-
-#include "llvm/Analysis/DataStructure.h"
-#include "llvm/Analysis/DSGraph.h"
#include "llvm/Pass.h"
#include "Support/BitSetVector.h"
#include "Support/NonCopyable.h"
@@ -49,12 +46,12 @@
class Module;
class Function;
class CallInst;
+class DSNode;
class DSGraph;
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
-
//---------------------------------------------------------------------------
// class ModRefInfo
//
@@ -67,7 +64,7 @@ class IPModRef; // Pass that computes IP Mod/Ref info
class ModRefInfo {
BitSetVector modNodeSet; // set of modified nodes
BitSetVector refNodeSet; // set of referenced nodes
-
+
public:
//
// Methods to construct ModRefInfo objects.
@@ -76,6 +73,12 @@ public:
: modNodeSet(numNodes),
refNodeSet(numNodes) { }
+ unsigned getSize() const {
+ assert(modNodeSet.size() == refNodeSet.size() &&
+ "Mod & Ref different size?");
+ return modNodeSet.size();
+ }
+
void setNodeIsMod (unsigned nodeId) { modNodeSet[nodeId] = true; }
void setNodeIsRef (unsigned nodeId) { refNodeSet[nodeId] = true; }
@@ -148,14 +151,12 @@ public:
//
unsigned getNodeId (const DSNode* node) const {
std::map<const DSNode*, unsigned>::const_iterator iter = NodeIds.find(node);
- assert(iter == NodeIds.end() || iter->second < funcTDGraph.getGraphSize());
- return (iter == NodeIds.end())? funcTDGraph.getGraphSize() : iter->second;
- }
- unsigned getNodeId (const Value* value) const {
- return getNodeId(funcTDGraph.getNodeForValue(const_cast<Value*>(value))
- .getNode());
+ assert(iter == NodeIds.end() || iter->second < funcModRefInfo.getSize());
+ return (iter == NodeIds.end())? funcModRefInfo.getSize() : iter->second;
}
+ unsigned getNodeId (const Value* value) const;
+
// Debugging support methods
void print(std::ostream &O) const;
void dump() const;
@@ -181,20 +182,7 @@ class IPModRef : public Pass {
Module* M;
FunctionModRefInfo& getFuncInfo(const Function& func,
- bool computeIfMissing = false)
- {
- FunctionModRefInfo*& funcInfo = funcToModRefInfoMap[&func];
- assert (funcInfo != NULL || computeIfMissing);
- if (funcInfo == NULL && computeIfMissing)
- { // Create a new FunctionModRefInfo object
- funcInfo = new FunctionModRefInfo(func, // inserts into map
- getAnalysis<TDDataStructures>().getDSGraph(func),
- getAnalysis<LocalDataStructures>().getDSGraph(func));
- funcInfo->computeModRef(func); // computes the mod/ref info
- }
- return *funcInfo;
- }
-
+ bool computeIfMissing = false);
public:
IPModRef() : M(NULL) { }
~IPModRef() { }
@@ -223,11 +211,7 @@ public:
// getAnalysisUsage - This pass requires top-down data structure graphs.
// It modifies nothing.
//
- virtual void getAnalysisUsage(AnalysisUsage &AU) const {
- AU.setPreservesAll();
- AU.addRequired<LocalDataStructures>();
- AU.addRequired<TDDataStructures>();
- }
+ virtual void getAnalysisUsage(AnalysisUsage &AU) const;
};
//===----------------------------------------------------------------------===//