Index: llvm/lib/Target/AMDGPU/SIISelLowering.cpp =================================================================== --- llvm/lib/Target/AMDGPU/SIISelLowering.cpp +++ llvm/lib/Target/AMDGPU/SIISelLowering.cpp @@ -12110,10 +12110,9 @@ if (Ty->isHalfTy()) return AtomicExpansionKind::None; - if (!Ty->isFloatTy() && (!Subtarget->hasGFX90AInsts() || !Ty->isDoubleTy())) + if (!Ty->isFloatTy() && !(Subtarget->hasGFX90AInsts() && Ty->isDoubleTy())) return AtomicExpansionKind::CmpXChg; - // TODO: Do have these for flat. Older targets also had them for buffers. unsigned AS = RMW->getPointerAddressSpace(); if ((AS == AMDGPUAS::GLOBAL_ADDRESS || AS == AMDGPUAS::FLAT_ADDRESS) && @@ -12129,20 +12128,22 @@ return AtomicExpansionKind::CmpXChg; if (Subtarget->hasGFX90AInsts()) { + if (Ty->isFloatTy() && AS == AMDGPUAS::FLAT_ADDRESS) + return AtomicExpansionKind::CmpXChg; + auto SSID = RMW->getSyncScopeID(); if (SSID == SyncScope::System || SSID == RMW->getContext().getOrInsertSyncScopeID("one-as")) return AtomicExpansionKind::CmpXChg; - return (Ty->isFloatTy() && AS == AMDGPUAS::FLAT_ADDRESS) ? - AtomicExpansionKind::CmpXChg : AtomicExpansionKind::None; + return AtomicExpansionKind::None; } - if (!Subtarget->hasGFX90AInsts() && AS != AMDGPUAS::GLOBAL_ADDRESS) + if (AS == AMDGPUAS::FLAT_ADDRESS) return AtomicExpansionKind::CmpXChg; - return RMW->use_empty() ? AtomicExpansionKind::None : - AtomicExpansionKind::CmpXChg; + return RMW->use_empty() ? AtomicExpansionKind::None + : AtomicExpansionKind::CmpXChg; } // DS FP atomics do repect the denormal mode, but the rounding mode is fixed