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