| //===- llvm/Analysis/LoopDependenceAnalysis.h --------------- -*- C++ -*---===// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // LoopDependenceAnalysis is an LLVM pass that analyses dependences in memory | |
| // accesses in loops. | |
| // | |
| // Please note that this is work in progress and the interface is subject to | |
| // change. | |
| // | |
| // TODO: adapt as interface progresses | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_ANALYSIS_LOOP_DEPENDENCE_ANALYSIS_H | |
| #define LLVM_ANALYSIS_LOOP_DEPENDENCE_ANALYSIS_H | |
| #include "llvm/ADT/DenseSet.h" | |
| #include "llvm/ADT/FoldingSet.h" | |
| #include "llvm/ADT/SmallVector.h" | |
| #include "llvm/Analysis/LoopPass.h" | |
| #include "llvm/Support/Allocator.h" | |
| namespace llvm { | |
| class AliasAnalysis; | |
| class AnalysisUsage; | |
| class ScalarEvolution; | |
| class SCEV; | |
| class Value; | |
| class raw_ostream; | |
| class LoopDependenceAnalysis : public LoopPass { | |
| AliasAnalysis *AA; | |
| ScalarEvolution *SE; | |
| /// L - The loop we are currently analysing. | |
| Loop *L; | |
| /// TODO: doc | |
| enum DependenceResult { Independent = 0, Dependent = 1, Unknown = 2 }; | |
| /// TODO: doc | |
| struct Subscript { | |
| /// TODO: Add distance, direction, breaking conditions, ... | |
| }; | |
| /// DependencePair - Represents a data dependence relation between to memory | |
| /// reference instructions. | |
| struct DependencePair : public FastFoldingSetNode { | |
| Value *A; | |
| Value *B; | |
| DependenceResult Result; | |
| SmallVector<Subscript, 4> Subscripts; | |
| DependencePair(const FoldingSetNodeID &ID, Value *a, Value *b) : | |
| FastFoldingSetNode(ID), A(a), B(b), Result(Unknown), Subscripts() {} | |
| }; | |
| /// findOrInsertDependencePair - Return true if a DependencePair for the | |
| /// given Values already exists, false if a new DependencePair had to be | |
| /// created. The third argument is set to the pair found or created. | |
| bool findOrInsertDependencePair(Value*, Value*, DependencePair*&); | |
| /// getLoops - Collect all loops of the loop nest L in which | |
| /// a given SCEV is variant. | |
| void getLoops(const SCEV*, DenseSet<const Loop*>*) const; | |
| /// isLoopInvariant - True if a given SCEV is invariant in all loops of the | |
| /// loop nest starting at the innermost loop L. | |
| bool isLoopInvariant(const SCEV*) const; | |
| /// isAffine - An SCEV is affine with respect to the loop nest starting at | |
| /// the innermost loop L if it is of the form A+B*X where A, B are invariant | |
| /// in the loop nest and X is a induction variable in the loop nest. | |
| bool isAffine(const SCEV*) const; | |
| /// TODO: doc | |
| bool isZIVPair(const SCEV*, const SCEV*) const; | |
| bool isSIVPair(const SCEV*, const SCEV*) const; | |
| DependenceResult analyseZIV(const SCEV*, const SCEV*, Subscript*) const; | |
| DependenceResult analyseSIV(const SCEV*, const SCEV*, Subscript*) const; | |
| DependenceResult analyseMIV(const SCEV*, const SCEV*, Subscript*) const; | |
| DependenceResult analyseSubscript(const SCEV*, const SCEV*, Subscript*) const; | |
| DependenceResult analysePair(DependencePair*) const; | |
| public: | |
| static char ID; // Class identification, replacement for typeinfo | |
| LoopDependenceAnalysis() : LoopPass(ID) { | |
| initializeLoopDependenceAnalysisPass(*PassRegistry::getPassRegistry()); | |
| } | |
| /// isDependencePair - Check whether two values can possibly give rise to | |
| /// a data dependence: that is the case if both are instructions accessing | |
| /// memory and at least one of those accesses is a write. | |
| bool isDependencePair(const Value*, const Value*) const; | |
| /// depends - Return a boolean indicating if there is a data dependence | |
| /// between two instructions. | |
| bool depends(Value*, Value*); | |
| bool runOnLoop(Loop*, LPPassManager&); | |
| virtual void releaseMemory(); | |
| virtual void getAnalysisUsage(AnalysisUsage&) const; | |
| void print(raw_ostream&, const Module* = 0) const; | |
| private: | |
| FoldingSet<DependencePair> Pairs; | |
| BumpPtrAllocator PairAllocator; | |
| }; // class LoopDependenceAnalysis | |
| // createLoopDependenceAnalysisPass - This creates an instance of the | |
| // LoopDependenceAnalysis pass. | |
| // | |
| LoopPass *createLoopDependenceAnalysisPass(); | |
| } // namespace llvm | |
| #endif /* LLVM_ANALYSIS_LOOP_DEPENDENCE_ANALYSIS_H */ |