blob: 02d28ad9dfec1daaa1c3a693d333e869af467096 [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"
19
20namespace llvm {
21
22
23/// Create ModuloSchedulingPass
24///
25FunctionPass *llvm::createDependenceAnalyzer() {
26 return new DependenceAnalyzer();
27}
28
29 bool DependenceAnalyzer::runOnFunction(Function &F) {
30 AA = &getAnalysis<AliasAnalysis>();
31 TD = &getAnalysis<TargetData>();
32
33 return false;
34 }
35
36 static RegisterAnalysis<DependenceAnalyzer>X("depanalyzer", "Dependence Analyzer");
37
38 DependenceResult DependenceAnalyzer::getDependenceInfo(Instruction *inst1, Instruction *inst2) {
39 std::vector<Dependence> deps;
40
41 DEBUG(std::cerr << "Inst1: " << *inst1 << "\n");
42 DEBUG(std::cerr << "Inst2: " << *inst2 << "\n");
43
44
45 if(LoadInst *ldInst = dyn_cast<LoadInst>(inst1)) {
46
47 if(StoreInst *stInst = dyn_cast<StoreInst>(inst2)) {
48 //Get load mem ref
49 Value *ldOp = ldInst->getOperand(0);
50
51 //Get store mem ref
52 Value *stOp = stInst->getOperand(1);
53
54 if(AA->alias(ldOp, (unsigned)TD->getTypeSize(ldOp->getType()),
55 stOp,(unsigned)TD->getTypeSize(stOp->getType()))
56 != AliasAnalysis::NoAlias) {
57
58 //Anti Dep
59 deps.push_back(Dependence(0, Dependence::AntiDep));
60 }
61 }
62 }
63
64 else if(StoreInst *stInst = dyn_cast<StoreInst>(inst1)) {
65
66 if(LoadInst *ldInst = dyn_cast<LoadInst>(inst2)) {
67 //Get load mem ref
68 Value *ldOp = ldInst->getOperand(0);
69
70 //Get store mem ref
71 Value *stOp = stInst->getOperand(1);
72
73
74 if(AA->alias(ldOp, (unsigned)TD->getTypeSize(ldOp->getType()),
75 stOp,(unsigned)TD->getTypeSize(stOp->getType()))
76 != AliasAnalysis::NoAlias) {
77
78 //Anti Dep
79 deps.push_back(Dependence(0, Dependence::TrueDep));
80 }
81 }
82 else if(StoreInst *stInst2 = dyn_cast<StoreInst>(inst2)) {
83
84 //Get load mem ref
85 Value *stOp1 = stInst->getOperand(1);
86
87 //Get store mem ref
88 Value *stOp2 = stInst2->getOperand(1);
89
90
91 if(AA->alias(stOp1, (unsigned)TD->getTypeSize(stOp1->getType()),
92 stOp2,(unsigned)TD->getTypeSize(stOp2->getType()))
93 != AliasAnalysis::NoAlias) {
94
95 //Anti Dep
96 deps.push_back(Dependence(0, Dependence::OutputDep));
97 }
98 }
99
100
101 }
102 else
103 assert("Expected a load or a store\n");
104
105 DependenceResult dr = DependenceResult(deps);
106 return dr;
107 }
108}
109
110