MemoryDependenceAnalysis.h revision df464195fe049d5ea921e2e37f4f833c2ea4e3ec
1//===- llvm/Analysis/MemoryDependenceAnalysis.h - Memory Deps --*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file was developed by the Owen Anderson and is distributed under 6// the University of Illinois Open Source License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file defines an analysis that determines, for a given memory operation, 11// what preceding memory operations it depends on. It builds on alias analysis 12// information, and tries to provide a lazy, caching interface to a common kind 13// of alias information query. 14// 15//===----------------------------------------------------------------------===// 16 17#ifndef LLVM_ANALYSIS_MEMORY_DEPENDENCE_H 18#define LLVM_ANALYSIS_MEMORY_DEPENDENCE_H 19 20#include "llvm/Pass.h" 21#include "llvm/Support/CallSite.h" 22#include "llvm/ADT/DenseMap.h" 23#include "llvm/ADT/SmallPtrSet.h" 24#include "llvm/Support/Compiler.h" 25#include <map> 26 27namespace llvm { 28 29class Function; 30class FunctionPass; 31class Instruction; 32 33class MemoryDependenceAnalysis : public FunctionPass { 34 private: 35 36 typedef DenseMap<Instruction*, std::pair<Instruction*, bool> > 37 depMapType; 38 39 depMapType depGraphLocal; 40 41 typedef std::multimap<Instruction*, Instruction*> reverseDepMapType; 42 reverseDepMapType reverseDep; 43 44 Instruction* getCallSiteDependency(CallSite C, Instruction* start, 45 bool local = true); 46 bool nonLocalHelper(Instruction* query, BasicBlock* block, 47 DenseMap<BasicBlock*, Value*>& resp, 48 SmallPtrSet<BasicBlock*, 4>& visited); 49 public: 50 51 static Instruction* NonLocal; 52 static Instruction* None; 53 54 static char ID; // Class identification, replacement for typeinfo 55 MemoryDependenceAnalysis() : FunctionPass((intptr_t)&ID) {} 56 57 /// Pass Implementation stuff. This doesn't do any analysis. 58 /// 59 bool runOnFunction(Function &) {return false; } 60 61 /// Clean up memory in between runs 62 void releaseMemory() { 63 depGraphLocal.clear(); 64 reverseDep.clear(); 65 } 66 67 /// getAnalysisUsage - Does not modify anything. It uses Value Numbering 68 /// and Alias Analysis. 69 /// 70 virtual void getAnalysisUsage(AnalysisUsage &AU) const; 71 72 /// getDependency - Return the instruction on which a memory operation 73 /// depends, starting with start. 74 Instruction* getDependency(Instruction* query, Instruction* start = 0, 75 BasicBlock* block = 0); 76 77 bool getNonLocalDependency(Instruction* query, 78 DenseMap<BasicBlock*, Value*>& resp); 79 80 /// removeInstruction - Remove an instruction from the dependence analysis, 81 /// updating the dependence of instructions that previously depended on it. 82 void removeInstruction(Instruction* rem); 83 }; 84 85} // End llvm namespace 86 87#endif 88