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;
}
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;
}