From: Peizhao Ou Date: Mon, 2 Apr 2018 23:44:38 +0000 (-0700) Subject: Converts relaxed stores/RMWs to release stores/RMWs X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=eead8ce5677fe43b93226d0ac5559b2ab01f0397;p=oota-llvm.git Converts relaxed stores/RMWs to release stores/RMWs --- diff --git a/lib/CodeGen/AtomicExpandPass.cpp b/lib/CodeGen/AtomicExpandPass.cpp index 077c52b19a7..2a0e6af67e4 100644 --- a/lib/CodeGen/AtomicExpandPass.cpp +++ b/lib/CodeGen/AtomicExpandPass.cpp @@ -118,6 +118,42 @@ bool AtomicExpand::runOnFunction(Function &F) { SmallVector AtomicInsts; SmallVector 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(&*I); + if (SI->getOrdering() == Monotonic) { + SI->setOrdering(Release); + MadeChange = true; + } + break; + } + case Instruction::AtomicCmpXchg: { + auto* CmpXInst = dyn_cast(&*I); + if (CmpXInst->getSuccessOrdering() == Monotonic) { + CmpXInst->setSuccessOrdering(Release); + MadeChange = true; + } + break; + } + case Instruction::AtomicRMW: { + auto* RMWInst = dyn_cast(&*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(I); auto SI = dyn_cast(I); diff --git a/lib/CodeGen/CodeGenPrepare.cpp b/lib/CodeGen/CodeGenPrepare.cpp index 3eaeaa2360c..bb183b4d6dc 100644 --- a/lib/CodeGen/CodeGenPrepare.cpp +++ b/lib/CodeGen/CodeGenPrepare.cpp @@ -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 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(&*I); - if (LI->getOrdering() == Monotonic && - !LI->getHasSubsequentAcqlRMW()) { - MonotonicLoadInsts.insert(LI); - } - break; - } - default: { - break; - } - } - } - } - EverMadeChange |= ConvertMonotonicLoadsToAcquire(MonotonicLoadInsts); - return EverMadeChange; }