diff options
| author | Owen Anderson <resistor@mac.com> | 2007-07-10 18:11:42 +0000 |
|---|---|---|
| committer | Owen Anderson <resistor@mac.com> | 2007-07-10 18:11:42 +0000 |
| commit | 94a21dd1e01bc943f6cd5122aeaadab76936d990 (patch) | |
| tree | dfb156c1ede2c635b75595533d45ed20c366d069 /llvm/lib | |
| parent | 9d41b311fbb1fcfff18036b34ceb873e1d8d4f58 (diff) | |
| download | bcm5719-llvm-94a21dd1e01bc943f6cd5122aeaadab76936d990.tar.gz bcm5719-llvm-94a21dd1e01bc943f6cd5122aeaadab76936d990.zip | |
Volatile loads and stores depend on each other.
llvm-svn: 38502
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Analysis/MemoryDependenceAnalysis.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp b/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp index 283b6b7f5df..944f532407a 100644 --- a/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp +++ b/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp @@ -121,12 +121,15 @@ Instruction* MemoryDependenceAnalysis::getDependency(Instruction* query, // Get the pointer value for which dependence will be determined Value* dependee = 0; uint64_t dependeeSize = 0; + bool queryIsVolatile = false; if (StoreInst* S = dyn_cast<StoreInst>(QI)) { dependee = S->getPointerOperand(); dependeeSize = TD.getTypeSize(S->getOperand(0)->getType()); + queryIsVolatile = S->isVolatile(); } else if (LoadInst* L = dyn_cast<LoadInst>(QI)) { dependee = L->getPointerOperand(); dependeeSize = TD.getTypeSize(L->getType()); + queryIsVolatile = L->isVolatile(); } else if (FreeInst* F = dyn_cast<FreeInst>(QI)) { dependee = F->getPointerOperand(); @@ -148,9 +151,23 @@ Instruction* MemoryDependenceAnalysis::getDependency(Instruction* query, Value* pointer = 0; uint64_t pointerSize = 0; if (StoreInst* S = dyn_cast<StoreInst>(QI)) { + // All volatile loads/stores depend on each other + if (queryIsVolatile && S->isVolatile()) { + depGraphLocal.insert(std::make_pair(query, std::make_pair(S, true))); + reverseDep.insert(std::make_pair(S, query)); + return S; + } + pointer = S->getPointerOperand(); pointerSize = TD.getTypeSize(S->getOperand(0)->getType()); } else if (LoadInst* L = dyn_cast<LoadInst>(QI)) { + // All volatile loads/stores depend on each other + if (queryIsVolatile && L->isVolatile()) { + depGraphLocal.insert(std::make_pair(query, std::make_pair(L, true))); + reverseDep.insert(std::make_pair(L, query)); + return L; + } + pointer = L->getPointerOperand(); pointerSize = TD.getTypeSize(L->getType()); } else if (AllocationInst* AI = dyn_cast<AllocationInst>(QI)) { |

