aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/DataStructure
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Analysis/DataStructure')
-rw-r--r--lib/Analysis/DataStructure/MemoryDepAnalysis.cpp2
-rw-r--r--lib/Analysis/DataStructure/MemoryDepAnalysis.h103
-rw-r--r--lib/Analysis/DataStructure/PgmDependenceGraph.cpp1
-rw-r--r--lib/Analysis/DataStructure/PgmDependenceGraph.h2
4 files changed, 105 insertions, 3 deletions
diff --git a/lib/Analysis/DataStructure/MemoryDepAnalysis.cpp b/lib/Analysis/DataStructure/MemoryDepAnalysis.cpp
index 97bc981603..5ef92f8bfb 100644
--- a/lib/Analysis/DataStructure/MemoryDepAnalysis.cpp
+++ b/lib/Analysis/DataStructure/MemoryDepAnalysis.cpp
@@ -17,7 +17,7 @@
//
//===----------------------------------------------------------------------===//
-#include "llvm/Analysis/MemoryDepAnalysis.h"
+#include "MemoryDepAnalysis.h"
#include "llvm/Module.h"
#include "llvm/iMemory.h"
#include "llvm/iOther.h"
diff --git a/lib/Analysis/DataStructure/MemoryDepAnalysis.h b/lib/Analysis/DataStructure/MemoryDepAnalysis.h
new file mode 100644
index 0000000000..b63ffa564a
--- /dev/null
+++ b/lib/Analysis/DataStructure/MemoryDepAnalysis.h
@@ -0,0 +1,103 @@
+//===- MemoryDepAnalysis.h - Compute dep graph for memory ops ---*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file was developed by the LLVM research group and is distributed under
+// the University of Illinois Open Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file provides a pass (MemoryDepAnalysis) that computes memory-based
+// data dependences between instructions for each function in a module.
+// Memory-based dependences occur due to load and store operations, but
+// also the side-effects of call instructions.
+//
+// The result of this pass is a DependenceGraph for each function
+// representing the memory-based data dependences between instructions.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_ANALYSIS_MEMORYDEPANALYSIS_H
+#define LLVM_ANALYSIS_MEMORYDEPANALYSIS_H
+
+#include "llvm/Analysis/DependenceGraph.h"
+#include "llvm/Pass.h"
+#include "Support/hash_map"
+
+namespace llvm {
+
+class ModRefTable;
+class DSGraph;
+class FunctionModRefInfo;
+
+///---------------------------------------------------------------------------
+/// class MemoryDepGraph:
+/// Dependence analysis for load/store/call instructions using IPModRef info
+/// computed at the granularity of individual DSGraph nodes.
+///
+/// This pass computes memory dependences for each function in a module.
+/// It can be made a FunctionPass once a Pass (such as Parallelize) is
+/// allowed to use a FunctionPass such as this one.
+///---------------------------------------------------------------------------
+
+class MemoryDepAnalysis : public Pass {
+ /// The following map and depGraph pointer are temporary until this class
+ /// becomes a FunctionPass instead of a module Pass.
+ hash_map<Function*, DependenceGraph*> funcMap;
+ DependenceGraph* funcDepGraph;
+
+ /// Information about one function being analyzed.
+ const DSGraph* funcGraph;
+ const FunctionModRefInfo* funcModRef;
+
+ /// Internal routine that processes each SCC of the CFG.
+ ///
+ void ProcessSCC(std::vector<BasicBlock*> &SCC, ModRefTable& ModRefAfter,
+ bool HasLoop);
+
+ friend class PgmDependenceGraph;
+
+public:
+ MemoryDepAnalysis() : funcDepGraph(0), funcGraph(0), funcModRef(0) {}
+ ~MemoryDepAnalysis();
+
+ /// Driver function to compute dependence graphs for every function.
+ ///
+ bool run(Module &M);
+
+ /// getGraph - Retrieve the dependence graph for a function.
+ /// This is temporary and will go away once this is a FunctionPass.
+ /// At that point, this class should directly inherit from DependenceGraph.
+ ///
+ DependenceGraph& getGraph(Function& F) {
+ hash_map<Function*, DependenceGraph*>::iterator I = funcMap.find(&F);
+ assert(I != funcMap.end());
+ return *I->second;
+ }
+ const DependenceGraph& getGraph(Function& F) const {
+ hash_map<Function*, DependenceGraph*>::const_iterator I = funcMap.find(&F);
+ assert(I != funcMap.end());
+ return *I->second;
+ }
+
+ /// Release depGraphs held in the Function -> DepGraph map.
+ ///
+ virtual void releaseMemory();
+
+ /// Driver functions to compute the Load/Store Dep. Graph per function.
+ ///
+ bool runOnFunction(Function &F);
+
+ /// getAnalysisUsage - This does not modify anything. It uses the Top-Down DS
+ /// Graph and IPModRef.
+ void getAnalysisUsage(AnalysisUsage &AU) const;
+
+ /// Debugging support methods
+ ///
+ void print(std::ostream &O) const;
+ void dump() const;
+};
+
+} // End llvm namespace
+
+#endif
diff --git a/lib/Analysis/DataStructure/PgmDependenceGraph.cpp b/lib/Analysis/DataStructure/PgmDependenceGraph.cpp
index b52848118c..b87126463c 100644
--- a/lib/Analysis/DataStructure/PgmDependenceGraph.cpp
+++ b/lib/Analysis/DataStructure/PgmDependenceGraph.cpp
@@ -26,7 +26,6 @@
//===----------------------------------------------------------------------===//
#include "PgmDependenceGraph.h"
-#include "llvm/Analysis/MemoryDepAnalysis.h"
#include "llvm/Analysis/PostDominators.h"
#include "llvm/Function.h"
diff --git a/lib/Analysis/DataStructure/PgmDependenceGraph.h b/lib/Analysis/DataStructure/PgmDependenceGraph.h
index 0ed0ba81ae..8906682eff 100644
--- a/lib/Analysis/DataStructure/PgmDependenceGraph.h
+++ b/lib/Analysis/DataStructure/PgmDependenceGraph.h
@@ -40,7 +40,7 @@
#define LLVM_ANALYSIS_PGMDEPENDENCEGRAPH_H
#include "llvm/Analysis/DependenceGraph.h"
-#include "llvm/Analysis/MemoryDepAnalysis.h"
+#include "MemoryDepAnalysis.h"
/* #include "llvm/Analysis/PostDominators.h" -- see below */
#include "llvm/Instruction.h"
#include "llvm/Pass.h"