blob: 53f12ed4acf8d63e0f87390215cf2849a14b2cfb [file] [log] [blame]
Tanya Lattner5ec3a632005-03-29 20:33:42 +00001//===-- DependenceAnalyzer.cpp - DependenceAnalyzer ----------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10//
11//
12//
13//===----------------------------------------------------------------------===//
14#define DEBUG_TYPE "ModuloSched"
15
16#include "DependenceAnalyzer.h"
Chris Lattnere6fea162005-04-01 15:41:30 +000017#include "llvm/Type.h"
Tanya Lattner5ec3a632005-03-29 20:33:42 +000018#include "llvm/Support/Debug.h"
Chris Lattnerce91ec92005-04-06 19:45:39 +000019using namespace llvm;
Tanya Lattner5ec3a632005-03-29 20:33:42 +000020
21
22/// Create ModuloSchedulingPass
23///
Chris Lattnerce91ec92005-04-06 19:45:39 +000024namespace llvm {
25FunctionPass *createDependenceAnalyzer() {
Tanya Lattner5ec3a632005-03-29 20:33:42 +000026 return new DependenceAnalyzer();
27}
Chris Lattnerce91ec92005-04-06 19:45:39 +000028}
Tanya Lattner5ec3a632005-03-29 20:33:42 +000029
30 bool DependenceAnalyzer::runOnFunction(Function &F) {
31 AA = &getAnalysis<AliasAnalysis>();
32 TD = &getAnalysis<TargetData>();
33
34 return false;
35 }
36
37 static RegisterAnalysis<DependenceAnalyzer>X("depanalyzer", "Dependence Analyzer");
38
39 DependenceResult DependenceAnalyzer::getDependenceInfo(Instruction *inst1, Instruction *inst2) {
40 std::vector<Dependence> deps;
41
42 DEBUG(std::cerr << "Inst1: " << *inst1 << "\n");
43 DEBUG(std::cerr << "Inst2: " << *inst2 << "\n");
44
45
46 if(LoadInst *ldInst = dyn_cast<LoadInst>(inst1)) {
47
48 if(StoreInst *stInst = dyn_cast<StoreInst>(inst2)) {
49 //Get load mem ref
50 Value *ldOp = ldInst->getOperand(0);
51
52 //Get store mem ref
53 Value *stOp = stInst->getOperand(1);
54
55 if(AA->alias(ldOp, (unsigned)TD->getTypeSize(ldOp->getType()),
56 stOp,(unsigned)TD->getTypeSize(stOp->getType()))
57 != AliasAnalysis::NoAlias) {
58
59 //Anti Dep
60 deps.push_back(Dependence(0, Dependence::AntiDep));
61 }
62 }
63 }
64
65 else if(StoreInst *stInst = dyn_cast<StoreInst>(inst1)) {
66
67 if(LoadInst *ldInst = dyn_cast<LoadInst>(inst2)) {
68 //Get load mem ref
69 Value *ldOp = ldInst->getOperand(0);
70
71 //Get store mem ref
72 Value *stOp = stInst->getOperand(1);
73
74
75 if(AA->alias(ldOp, (unsigned)TD->getTypeSize(ldOp->getType()),
76 stOp,(unsigned)TD->getTypeSize(stOp->getType()))
77 != AliasAnalysis::NoAlias) {
78
79 //Anti Dep
80 deps.push_back(Dependence(0, Dependence::TrueDep));
81 }
82 }
83 else if(StoreInst *stInst2 = dyn_cast<StoreInst>(inst2)) {
84
85 //Get load mem ref
86 Value *stOp1 = stInst->getOperand(1);
87
88 //Get store mem ref
89 Value *stOp2 = stInst2->getOperand(1);
90
91
92 if(AA->alias(stOp1, (unsigned)TD->getTypeSize(stOp1->getType()),
93 stOp2,(unsigned)TD->getTypeSize(stOp2->getType()))
94 != AliasAnalysis::NoAlias) {
95
96 //Anti Dep
97 deps.push_back(Dependence(0, Dependence::OutputDep));
98 }
99 }
100
101
102 }
103 else
104 assert("Expected a load or a store\n");
105
106 DependenceResult dr = DependenceResult(deps);
107 return dr;
108 }
Tanya Lattner5ec3a632005-03-29 20:33:42 +0000109