Volatile loads and stores depend on each other.
authorOwen Anderson <resistor@mac.com>
Tue, 10 Jul 2007 18:11:42 +0000 (18:11 +0000)
committerOwen Anderson <resistor@mac.com>
Tue, 10 Jul 2007 18:11:42 +0000 (18:11 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@38502 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/MemoryDependenceAnalysis.cpp

index 283b6b7f5dff825d77f7ac2b4879cc125ef58631..944f532407ab06801a4d52923d3adadbbdf7a694 100644 (file)
@@ -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)) {