diff --git a/lib/Analysis/DataStructure/MemoryDepAnalysis.cpp b/lib/Analysis/DataStructure/MemoryDepAnalysis.cpp index 97bc9816031..5ef92f8bfbe 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 00000000000..b63ffa564a4 --- /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 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 &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::iterator I = funcMap.find(&F); + assert(I != funcMap.end()); + return *I->second; + } + const DependenceGraph& getGraph(Function& F) const { + hash_map::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 b52848118cf..b87126463c2 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 0ed0ba81aee..8906682eff9 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"