00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef LLVM_ANALYSIS_LOOP_DEPENDENCE_ANALYSIS_H
00021 #define LLVM_ANALYSIS_LOOP_DEPENDENCE_ANALYSIS_H
00022
00023 #include "llvm/ADT/DenseSet.h"
00024 #include "llvm/ADT/FoldingSet.h"
00025 #include "llvm/ADT/SmallVector.h"
00026 #include "llvm/Analysis/LoopPass.h"
00027 #include "llvm/Support/Allocator.h"
00028
00029 namespace llvm {
00030
00031 class AliasAnalysis;
00032 class AnalysisUsage;
00033 class ScalarEvolution;
00034 class SCEV;
00035 class Value;
00036 class raw_ostream;
00037
00038 class LoopDependenceAnalysis : public LoopPass {
00039 AliasAnalysis *AA;
00040 ScalarEvolution *SE;
00041
00043 Loop *L;
00044
00046 enum DependenceResult { Independent = 0, Dependent = 1, Unknown = 2 };
00047
00049 struct Subscript {
00051 };
00052
00055 struct DependencePair : public FastFoldingSetNode {
00056 Value *A;
00057 Value *B;
00058 DependenceResult Result;
00059 SmallVector<Subscript, 4> Subscripts;
00060
00061 DependencePair(const FoldingSetNodeID &ID, Value *a, Value *b) :
00062 FastFoldingSetNode(ID), A(a), B(b), Result(Unknown), Subscripts() {}
00063 };
00064
00068 bool findOrInsertDependencePair(Value*, Value*, DependencePair*&);
00069
00072 void getLoops(const SCEV*, DenseSet<const Loop*>*) const;
00073
00076 bool isLoopInvariant(const SCEV*) const;
00077
00081 bool isAffine(const SCEV*) const;
00082
00084 bool isZIVPair(const SCEV*, const SCEV*) const;
00085 bool isSIVPair(const SCEV*, const SCEV*) const;
00086 DependenceResult analyseZIV(const SCEV*, const SCEV*, Subscript*) const;
00087 DependenceResult analyseSIV(const SCEV*, const SCEV*, Subscript*) const;
00088 DependenceResult analyseMIV(const SCEV*, const SCEV*, Subscript*) const;
00089 DependenceResult analyseSubscript(const SCEV*, const SCEV*, Subscript*) const;
00090 DependenceResult analysePair(DependencePair*) const;
00091
00092 public:
00093 static char ID;
00094 LoopDependenceAnalysis() : LoopPass(&ID) {}
00095
00099 bool isDependencePair(const Value*, const Value*) const;
00100
00103 bool depends(Value*, Value*);
00104
00105 bool runOnLoop(Loop*, LPPassManager&);
00106 virtual void releaseMemory();
00107 virtual void getAnalysisUsage(AnalysisUsage&) const;
00108 void print(raw_ostream&, const Module* = 0) const;
00109
00110 private:
00111 FoldingSet<DependencePair> Pairs;
00112 BumpPtrAllocator PairAllocator;
00113 };
00114
00115
00116
00117
00118 LoopPass *createLoopDependenceAnalysisPass();
00119
00120 }
00121
00122 #endif