@@ -8761,7 +8761,9 @@ OpenMPIRBuilder::createAtomicWrite(const LocationDescription &Loc,
8761
8761
OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createAtomicUpdate (
8762
8762
const LocationDescription &Loc, InsertPointTy AllocaIP, AtomicOpValue &X,
8763
8763
Value *Expr, AtomicOrdering AO, AtomicRMWInst::BinOp RMWOp,
8764
- AtomicUpdateCallbackTy &UpdateOp, bool IsXBinopExpr) {
8764
+ AtomicUpdateCallbackTy &UpdateOp, bool IsXBinopExpr,
8765
+ bool IsAmdgpuIgnoreDenormalMode, bool IsNoFineGrainedMemory,
8766
+ bool IsNoRemoteMemory) {
8765
8767
assert (!isConflictIP (Loc.IP , AllocaIP) && " IPs must not be ambiguous" );
8766
8768
if (!updateToLocation (Loc))
8767
8769
return Loc.IP ;
@@ -8781,7 +8783,8 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createAtomicUpdate(
8781
8783
8782
8784
Expected<std::pair<Value *, Value *>> AtomicResult =
8783
8785
emitAtomicUpdate (AllocaIP, X.Var , X.ElemTy , Expr, AO, RMWOp, UpdateOp,
8784
- X.IsVolatile , IsXBinopExpr);
8786
+ X.IsVolatile , IsXBinopExpr, IsAmdgpuIgnoreDenormalMode,
8787
+ IsNoFineGrainedMemory, IsNoRemoteMemory);
8785
8788
if (!AtomicResult)
8786
8789
return AtomicResult.takeError ();
8787
8790
checkAndEmitFlushAfterAtomic (Loc, AO, AtomicKind::Update);
@@ -8828,7 +8831,9 @@ Value *OpenMPIRBuilder::emitRMWOpAsInstruction(Value *Src1, Value *Src2,
8828
8831
Expected<std::pair<Value *, Value *>> OpenMPIRBuilder::emitAtomicUpdate (
8829
8832
InsertPointTy AllocaIP, Value *X, Type *XElemTy, Value *Expr,
8830
8833
AtomicOrdering AO, AtomicRMWInst::BinOp RMWOp,
8831
- AtomicUpdateCallbackTy &UpdateOp, bool VolatileX, bool IsXBinopExpr) {
8834
+ AtomicUpdateCallbackTy &UpdateOp, bool VolatileX, bool IsXBinopExpr,
8835
+ bool IsAmdgpuIgnoreDenormalMode, bool IsAmdgpuNoFineGrainedMemory,
8836
+ bool IsAmdgpuNoRemoteMemory) {
8832
8837
// TODO: handle the case where XElemTy is not byte-sized or not a power of 2
8833
8838
// or a complex datatype.
8834
8839
bool emitRMWOp = false ;
@@ -8851,7 +8856,18 @@ Expected<std::pair<Value *, Value *>> OpenMPIRBuilder::emitAtomicUpdate(
8851
8856
8852
8857
std::pair<Value *, Value *> Res;
8853
8858
if (emitRMWOp) {
8854
- Res.first = Builder.CreateAtomicRMW (RMWOp, X, Expr, llvm::MaybeAlign (), AO);
8859
+ AtomicRMWInst *atomicRMWInst =
8860
+ Builder.CreateAtomicRMW (RMWOp, X, Expr, llvm::MaybeAlign (), AO);
8861
+ if (IsAmdgpuIgnoreDenormalMode)
8862
+ atomicRMWInst->setMetadata (" amdgpu.ignore.denormal.mode" ,
8863
+ llvm::MDNode::get (Builder.getContext (), {}));
8864
+ if (IsAmdgpuNoFineGrainedMemory)
8865
+ atomicRMWInst->setMetadata (" amdgpu.no.fine.grained.memory" ,
8866
+ llvm::MDNode::get (Builder.getContext (), {}));
8867
+ if (IsAmdgpuNoRemoteMemory)
8868
+ atomicRMWInst->setMetadata (" amdgpu.no.remote.memory" ,
8869
+ llvm::MDNode::get (Builder.getContext (), {}));
8870
+ Res.first = atomicRMWInst;
8855
8871
// not needed except in case of postfix captures. Generate anyway for
8856
8872
// consistency with the else part. Will be removed with any DCE pass.
8857
8873
// AtomicRMWInst::Xchg does not have a coressponding instruction.
@@ -8983,7 +8999,9 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createAtomicCapture(
8983
8999
const LocationDescription &Loc, InsertPointTy AllocaIP, AtomicOpValue &X,
8984
9000
AtomicOpValue &V, Value *Expr, AtomicOrdering AO,
8985
9001
AtomicRMWInst::BinOp RMWOp, AtomicUpdateCallbackTy &UpdateOp,
8986
- bool UpdateExpr, bool IsPostfixUpdate, bool IsXBinopExpr) {
9002
+ bool UpdateExpr, bool IsPostfixUpdate, bool IsXBinopExpr,
9003
+ bool IsAmdgpuIgnoreDenormalMode, bool IsAmdgpuNoFineGrainedMemory,
9004
+ bool IsAmdgpuNoRemoteMemory) {
8987
9005
if (!updateToLocation (Loc))
8988
9006
return Loc.IP ;
8989
9007
@@ -9004,7 +9022,8 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createAtomicCapture(
9004
9022
AtomicRMWInst::BinOp AtomicOp = (UpdateExpr ? RMWOp : AtomicRMWInst::Xchg);
9005
9023
Expected<std::pair<Value *, Value *>> AtomicResult =
9006
9024
emitAtomicUpdate (AllocaIP, X.Var , X.ElemTy , Expr, AO, AtomicOp, UpdateOp,
9007
- X.IsVolatile , IsXBinopExpr);
9025
+ X.IsVolatile , IsXBinopExpr, IsAmdgpuIgnoreDenormalMode,
9026
+ IsAmdgpuNoFineGrainedMemory, IsAmdgpuNoRemoteMemory);
9008
9027
if (!AtomicResult)
9009
9028
return AtomicResult.takeError ();
9010
9029
Value *CapturedVal =
0 commit comments