Transform RMW with Acqure to AcquireRelease
authorPeizhao Ou <peizhaoo@uci.edu>
Wed, 4 Apr 2018 07:48:46 +0000 (00:48 -0700)
committerPeizhao Ou <peizhaoo@uci.edu>
Wed, 4 Apr 2018 07:48:46 +0000 (00:48 -0700)
lib/CodeGen/AtomicExpandPass.cpp

index 2a0e6af67e4f7977a39c865ac33d50d853845d6b..180aba7870993bf26f5c1fadc2c8b595bd2ee9b9 100644 (file)
@@ -125,6 +125,8 @@ bool AtomicExpand::runOnFunction(Function &F) {
       switch (I->getOpcode()) {
         case Instruction::Store: {
           auto* SI = dyn_cast<StoreInst>(&*I);
+          // Store with acquire is treated as monotonic and should be
+          // transformed to monotonic by earlier passes.
           if (SI->getOrdering() == Monotonic) {
             SI->setOrdering(Release);
             MadeChange = true;
@@ -133,17 +135,25 @@ bool AtomicExpand::runOnFunction(Function &F) {
         }
         case Instruction::AtomicCmpXchg: {
           auto* CmpXInst = dyn_cast<AtomicCmpXchgInst>(&*I);
-          if (CmpXInst->getSuccessOrdering() == Monotonic) {
+          auto SuccOrder = CmpXInst->getSuccessOrdering();
+          if (SuccOrder == Monotonic) {
             CmpXInst->setSuccessOrdering(Release);
             MadeChange = true;
+          } else if (SuccOrder == Acquire) {
+            CmpXInst->setSuccessOrdering(AcquireRelease);
+            MadeChange = true;
           }
           break;
         }
         case Instruction::AtomicRMW: {
           auto* RMWInst = dyn_cast<AtomicRMWInst>(&*I);
-          if (RMWInst->getOrdering() == Monotonic) {
+          auto Order = RMWInst->getOrdering();
+          if (Order == Monotonic) {
             RMWInst->setOrdering(Release);
             MadeChange = true;
+          } else if (Order == Acquire) {
+            RMWInst->setOrdering(AcquireRelease);
+            MadeChange = true;
           }
           break;
         }