From: Owen Anderson Date: Tue, 10 Jul 2007 18:11:42 +0000 (+0000) Subject: Volatile loads and stores depend on each other. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=e314eb3255299a995088323384d317be52e743f9;p=oota-llvm.git Volatile loads and stores depend on each other. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@38502 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/MemoryDependenceAnalysis.cpp b/lib/Analysis/MemoryDependenceAnalysis.cpp index 283b6b7f5df..944f532407a 100644 --- a/lib/Analysis/MemoryDependenceAnalysis.cpp +++ b/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(QI)) { dependee = S->getPointerOperand(); dependeeSize = TD.getTypeSize(S->getOperand(0)->getType()); + queryIsVolatile = S->isVolatile(); } else if (LoadInst* L = dyn_cast(QI)) { dependee = L->getPointerOperand(); dependeeSize = TD.getTypeSize(L->getType()); + queryIsVolatile = L->isVolatile(); } else if (FreeInst* F = dyn_cast(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(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(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(QI)) {