From: Peizhao Ou Date: Wed, 4 Apr 2018 07:48:46 +0000 (-0700) Subject: Transform RMW with Acqure to AcquireRelease X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=3232d9b223cb7f497736f7a14e8a34e6957e61a3;p=oota-llvm.git Transform RMW with Acqure to AcquireRelease --- diff --git a/lib/CodeGen/AtomicExpandPass.cpp b/lib/CodeGen/AtomicExpandPass.cpp index 2a0e6af67e4..180aba78709 100644 --- a/lib/CodeGen/AtomicExpandPass.cpp +++ b/lib/CodeGen/AtomicExpandPass.cpp @@ -125,6 +125,8 @@ bool AtomicExpand::runOnFunction(Function &F) { switch (I->getOpcode()) { case Instruction::Store: { auto* SI = dyn_cast(&*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(&*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(&*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; }