Converts relaxed stores/RMWs to release stores/RMWs
authorPeizhao Ou <peizhaoo@uci.edu>
Mon, 2 Apr 2018 23:44:38 +0000 (16:44 -0700)
committerPeizhao Ou <peizhaoo@uci.edu>
Mon, 2 Apr 2018 23:44:38 +0000 (16:44 -0700)
lib/CodeGen/AtomicExpandPass.cpp
lib/CodeGen/CodeGenPrepare.cpp

index 077c52b19a7a3d1907cdd3dcda9eb967ccaf0f51..2a0e6af67e4f7977a39c865ac33d50d853845d6b 100644 (file)
@@ -118,6 +118,42 @@ bool AtomicExpand::runOnFunction(Function &F) {
   SmallVector<Instruction *, 1> AtomicInsts;
   SmallVector<LoadInst*, 1> MonotonicLoadInsts;
 
+  bool MadeChange = false;
+  // XXX-comment: Converts relaxed stores to release stores.
+  for (inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I) {
+    if (I->isAtomic()) {
+      switch (I->getOpcode()) {
+        case Instruction::Store: {
+          auto* SI = dyn_cast<StoreInst>(&*I);
+          if (SI->getOrdering() == Monotonic) {
+            SI->setOrdering(Release);
+            MadeChange = true;
+          }
+          break;
+        }
+        case Instruction::AtomicCmpXchg: {
+          auto* CmpXInst = dyn_cast<AtomicCmpXchgInst>(&*I);
+          if (CmpXInst->getSuccessOrdering() == Monotonic) {
+            CmpXInst->setSuccessOrdering(Release);
+            MadeChange = true;
+          }
+          break;
+        }
+        case Instruction::AtomicRMW: {
+          auto* RMWInst = dyn_cast<AtomicRMWInst>(&*I);
+          if (RMWInst->getOrdering() == Monotonic) {
+            RMWInst->setOrdering(Release);
+            MadeChange = true;
+          }
+          break;
+        }
+        default: {
+          break;
+        }
+      }
+    }
+  }
+
   // Changing control-flow while iterating through it is a bad idea, so gather a
   // list of all atomic instructions before we start.
   for (inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I) {
@@ -173,7 +209,6 @@ bool AtomicExpand::runOnFunction(Function &F) {
     }
   }
 
-  bool MadeChange = false;
   for (auto I : AtomicInsts) {
     auto LI = dyn_cast<LoadInst>(I);
     auto SI = dyn_cast<StoreInst>(I);
index 3eaeaa2360c9ab89e434faa9053c887b98f519a7..bb183b4d6dc9fc83083d8c8382b5e095397327cd 100644 (file)
@@ -1419,30 +1419,6 @@ bool CodeGenPrepare::runOnFunction(Function &F) {
     for (auto &I : Statepoints)
       EverMadeChange |= simplifyOffsetableRelocate(*I);
   }
-
-  // XXX-comment: Delay dealing with relaxed loads in this function to avoid
-  // further changes done by other passes (e.g., SimplifyCFG).
-  // Collect all the relaxed loads.
-  SmallSet<LoadInst*, 1> MonotonicLoadInsts;
-  for (inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I) {
-    if (I->isAtomic()) {
-      switch (I->getOpcode()) {
-        case Instruction::Load: {
-          auto* LI = dyn_cast<LoadInst>(&*I);
-          if (LI->getOrdering() == Monotonic &&
-              !LI->getHasSubsequentAcqlRMW()) {
-            MonotonicLoadInsts.insert(LI);
-          }
-          break;
-        }
-        default: {
-          break;
-        }
-      }
-    }
-  }
-  EverMadeChange |= ConvertMonotonicLoadsToAcquire(MonotonicLoadInsts);
-
   return EverMadeChange;
 }