Updated dependence analyzer. Fixed numerous bugs. Same stage scheduling, etc.
llvm-svn: 21444
diff --git a/llvm/lib/Target/SparcV9/ModuloScheduling/DependenceAnalyzer.h b/llvm/lib/Target/SparcV9/ModuloScheduling/DependenceAnalyzer.h
index 6223fb7..2440ea9 100644
--- a/llvm/lib/Target/SparcV9/ModuloScheduling/DependenceAnalyzer.h
+++ b/llvm/lib/Target/SparcV9/ModuloScheduling/DependenceAnalyzer.h
@@ -17,10 +17,12 @@
#include "llvm/Function.h"
#include "llvm/Pass.h"
#include "llvm/Analysis/AliasAnalysis.h"
+#include "llvm/Analysis/ScalarEvolutionExpressions.h"
#include "llvm/Target/TargetData.h"
#include <vector>
namespace llvm {
+
//class to represent a dependence
struct Dependence {
@@ -47,11 +49,25 @@
class DependenceAnalyzer : public FunctionPass {
+
+
AliasAnalysis *AA;
TargetData *TD;
+ ScalarEvolution *SE;
+
+ void advancedDepAnalysis(GetElementPtrInst *gp1, GetElementPtrInst *gp2,
+ bool valLoad, bool val2Load,
+ std::vector<Dependence> &deps, bool srcBeforeDest);
+
+ void AnalyzeDeps(Value *val, Value *val2, bool val1Load, bool val2Load,
+ std::vector<Dependence> &deps, BasicBlock *BB,
+ bool srcBeforeDest);
+
+ void createDep(std::vector<Dependence> &deps, bool valLoad, bool val2Load,
+ bool srcBeforeDest, int diff = 0);
public:
- DependenceAnalyzer() { AA = 0; TD = 0; }
+ DependenceAnalyzer() { AA = 0; TD = 0; SE = 0; }
virtual bool runOnFunction(Function &F);
virtual const char* getPassName() const { return "DependenceAnalyzer"; }
@@ -59,10 +75,13 @@
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired<AliasAnalysis>();
AU.addRequired<TargetData>();
+ AU.addRequired<ScalarEvolution>();
+ AU.setPreservesAll();
}
//get dependence info
- DependenceResult getDependenceInfo(Instruction *inst1, Instruction *inst2);
+ DependenceResult getDependenceInfo(Instruction *inst1, Instruction *inst2,
+ bool srcBeforeDest);
};