Skip to content

Commit 9a6d860

Browse files
committed
backend changes
1 parent 51c6a6a commit 9a6d860

File tree

12 files changed

+192
-160
lines changed

12 files changed

+192
-160
lines changed

llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3278,7 +3278,8 @@ class OpenMPIRBuilder {
32783278
emitAtomicUpdate(InsertPointTy AllocaIP, Value *X, Type *XElemTy, Value *Expr,
32793279
AtomicOrdering AO, AtomicRMWInst::BinOp RMWOp,
32803280
AtomicUpdateCallbackTy &UpdateOp, bool VolatileX,
3281-
bool IsXBinopExpr);
3281+
bool IsXBinopExpr, bool IsAmdgpuIgnoreDenormalMode,
3282+
bool IsAmdgpuNoFineGrainedMemory, bool IsAmdgpuNoRemoteMemory);
32823283

32833284
/// Emit the binary op. described by \p RMWOp, using \p Src1 and \p Src2 .
32843285
///
@@ -3349,7 +3350,9 @@ class OpenMPIRBuilder {
33493350
LLVM_ABI InsertPointOrErrorTy createAtomicUpdate(
33503351
const LocationDescription &Loc, InsertPointTy AllocaIP, AtomicOpValue &X,
33513352
Value *Expr, AtomicOrdering AO, AtomicRMWInst::BinOp RMWOp,
3352-
AtomicUpdateCallbackTy &UpdateOp, bool IsXBinopExpr);
3353+
AtomicUpdateCallbackTy &UpdateOp, bool IsXBinopExpr,
3354+
bool IsAmdgpuIgnoreDenormalMode = false,
3355+
bool IsAmdgpuNoFineGrainedMemory = false, bool IsAmdgpuNoRemoteMemory = false);
33533356

33543357
/// Emit atomic update for constructs: --- Only Scalar data types
33553358
/// V = X; X = X BinOp Expr ,
@@ -3384,7 +3387,9 @@ class OpenMPIRBuilder {
33843387
const LocationDescription &Loc, InsertPointTy AllocaIP, AtomicOpValue &X,
33853388
AtomicOpValue &V, Value *Expr, AtomicOrdering AO,
33863389
AtomicRMWInst::BinOp RMWOp, AtomicUpdateCallbackTy &UpdateOp,
3387-
bool UpdateExpr, bool IsPostfixUpdate, bool IsXBinopExpr);
3390+
bool UpdateExpr, bool IsPostfixUpdate, bool IsXBinopExpr,
3391+
bool IsAmdgpuIgnoreDenormalMode = false,
3392+
bool IsAmdgpuNoFineGrainedMemory = false, bool IsAmdgpuNoRemoteMemory = false);
33883393

33893394
/// Emit atomic compare for constructs: --- Only scalar data types
33903395
/// cond-expr-stmt:

llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8761,7 +8761,8 @@ OpenMPIRBuilder::createAtomicWrite(const LocationDescription &Loc,
87618761
OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createAtomicUpdate(
87628762
const LocationDescription &Loc, InsertPointTy AllocaIP, AtomicOpValue &X,
87638763
Value *Expr, AtomicOrdering AO, AtomicRMWInst::BinOp RMWOp,
8764-
AtomicUpdateCallbackTy &UpdateOp, bool IsXBinopExpr) {
8764+
AtomicUpdateCallbackTy &UpdateOp, bool IsXBinopExpr, bool IsAmdgpuIgnoreDenormalMode,
8765+
bool IsNoFineGrainedMemory, bool IsNoRemoteMemory) {
87658766
assert(!isConflictIP(Loc.IP, AllocaIP) && "IPs must not be ambiguous");
87668767
if (!updateToLocation(Loc))
87678768
return Loc.IP;
@@ -8781,7 +8782,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createAtomicUpdate(
87818782

87828783
Expected<std::pair<Value *, Value *>> AtomicResult =
87838784
emitAtomicUpdate(AllocaIP, X.Var, X.ElemTy, Expr, AO, RMWOp, UpdateOp,
8784-
X.IsVolatile, IsXBinopExpr);
8785+
X.IsVolatile, IsXBinopExpr, IsAmdgpuIgnoreDenormalMode, IsNoFineGrainedMemory, IsNoRemoteMemory);
87858786
if (!AtomicResult)
87868787
return AtomicResult.takeError();
87878788
checkAndEmitFlushAfterAtomic(Loc, AO, AtomicKind::Update);
@@ -8828,7 +8829,8 @@ Value *OpenMPIRBuilder::emitRMWOpAsInstruction(Value *Src1, Value *Src2,
88288829
Expected<std::pair<Value *, Value *>> OpenMPIRBuilder::emitAtomicUpdate(
88298830
InsertPointTy AllocaIP, Value *X, Type *XElemTy, Value *Expr,
88308831
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) {
88328834
// TODO: handle the case where XElemTy is not byte-sized or not a power of 2
88338835
// or a complex datatype.
88348836
bool emitRMWOp = false;
@@ -8851,7 +8853,17 @@ Expected<std::pair<Value *, Value *>> OpenMPIRBuilder::emitAtomicUpdate(
88518853

88528854
std::pair<Value *, Value *> Res;
88538855
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;
88558867
// not needed except in case of postfix captures. Generate anyway for
88568868
// consistency with the else part. Will be removed with any DCE pass.
88578869
// AtomicRMWInst::Xchg does not have a coressponding instruction.
@@ -8983,7 +8995,8 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createAtomicCapture(
89838995
const LocationDescription &Loc, InsertPointTy AllocaIP, AtomicOpValue &X,
89848996
AtomicOpValue &V, Value *Expr, AtomicOrdering AO,
89858997
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) {
89879000
if (!updateToLocation(Loc))
89889001
return Loc.IP;
89899002

@@ -9004,7 +9017,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createAtomicCapture(
90049017
AtomicRMWInst::BinOp AtomicOp = (UpdateExpr ? RMWOp : AtomicRMWInst::Xchg);
90059018
Expected<std::pair<Value *, Value *>> AtomicResult =
90069019
emitAtomicUpdate(AllocaIP, X.Var, X.ElemTy, Expr, AO, AtomicOp, UpdateOp,
9007-
X.IsVolatile, IsXBinopExpr);
9020+
X.IsVolatile, IsXBinopExpr, IsAmdgpuIgnoreDenormalMode, IsAmdgpuNoFineGrainedMemory, IsAmdgpuNoRemoteMemory);
90089021
if (!AtomicResult)
90099022
return AtomicResult.takeError();
90109023
Value *CapturedVal =

mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1546,7 +1546,7 @@ def AtomicUpdateOp : OpenMP_Op<"atomic.update", traits = [
15461546
let arguments = !con(
15471547
(ins Arg<OpenMP_PointerLikeType,
15481548
"Address of variable to be updated", [MemRead, MemWrite]>:$x,
1549-
OptionalAttr<AtomicControlAttr>:$atomic_control),
1549+
AtomicControlAttr:$atomic_control),
15501550
clausesArgs);
15511551

15521552
// Override region definition.

mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3165,13 +3165,18 @@ convertOmpAtomicUpdate(omp::AtomicUpdateOp &opInst,
31653165
return moduleTranslation.lookupValue(yieldop.getResults()[0]);
31663166
};
31673167

3168+
mlir::omp::AtomicControlAttr atomicControlAttr = opInst.getAtomicControlAttr();
3169+
bool isAmdgpuIgnoreDenormalMode = atomicControlAttr.getAmdgpuIgnoreDenormalMode();
3170+
bool isAmdgpuNoFineGrainedMemory = !atomicControlAttr.getAmdgpuFineGrainedMemory();
3171+
bool isAmdgpuNoRemoteMemory = !atomicControlAttr.getAmdgpuRemoteMemory();
31683172
// Handle ambiguous alloca, if any.
31693173
auto allocaIP = findAllocaInsertPoint(builder, moduleTranslation);
31703174
llvm::OpenMPIRBuilder::LocationDescription ompLoc(builder);
31713175
llvm::OpenMPIRBuilder::InsertPointOrErrorTy afterIP =
31723176
ompBuilder->createAtomicUpdate(ompLoc, allocaIP, llvmAtomicX, llvmExpr,
31733177
atomicOrdering, binop, updateFn,
3174-
isXBinopExpr);
3178+
isXBinopExpr, isAmdgpuIgnoreDenormalMode, isAmdgpuNoFineGrainedMemory, isAmdgpuNoRemoteMemory);
3179+
31753180

31763181
if (failed(handleError(afterIP, *opInst)))
31773182
return failure();
@@ -3193,6 +3198,7 @@ convertOmpAtomicCapture(omp::AtomicCaptureOp atomicCaptureOp,
31933198
llvm::AtomicRMWInst::BinOp binop = llvm::AtomicRMWInst::BinOp::BAD_BINOP;
31943199

31953200
omp::AtomicUpdateOp atomicUpdateOp = atomicCaptureOp.getAtomicUpdateOp();
3201+
31963202
omp::AtomicWriteOp atomicWriteOp = atomicCaptureOp.getAtomicWriteOp();
31973203

31983204
assert((atomicUpdateOp || atomicWriteOp) &&
@@ -3260,13 +3266,23 @@ convertOmpAtomicCapture(omp::AtomicCaptureOp atomicCaptureOp,
32603266
return moduleTranslation.lookupValue(yieldop.getResults()[0]);
32613267
};
32623268

3269+
bool isAmdgpuIgnoreDenormalMode = false;
3270+
bool isAmdgpuNoFineGrainedMemory = true;
3271+
bool isAmdgpuNoRemoteMemory = true;
3272+
if(atomicUpdateOp) {
3273+
mlir::omp::AtomicControlAttr atomicControlAttr = atomicUpdateOp.getAtomicControlAttr();
3274+
isAmdgpuIgnoreDenormalMode = atomicControlAttr.getAmdgpuIgnoreDenormalMode();
3275+
isAmdgpuNoFineGrainedMemory = !atomicControlAttr.getAmdgpuFineGrainedMemory();
3276+
isAmdgpuNoRemoteMemory = !atomicControlAttr.getAmdgpuRemoteMemory();
3277+
}
32633278
// Handle ambiguous alloca, if any.
32643279
auto allocaIP = findAllocaInsertPoint(builder, moduleTranslation);
32653280
llvm::OpenMPIRBuilder::LocationDescription ompLoc(builder);
32663281
llvm::OpenMPIRBuilder::InsertPointOrErrorTy afterIP =
32673282
ompBuilder->createAtomicCapture(
32683283
ompLoc, allocaIP, llvmAtomicX, llvmAtomicV, llvmExpr, atomicOrdering,
3269-
binop, updateFn, atomicUpdateOp, isPostfixUpdate, isXBinopExpr);
3284+
binop, updateFn, atomicUpdateOp, isPostfixUpdate,
3285+
isXBinopExpr, isAmdgpuIgnoreDenormalMode, isAmdgpuNoFineGrainedMemory, isAmdgpuNoRemoteMemory);
32703286

32713287
if (failed(handleError(afterIP, *atomicCaptureOp)))
32723288
return failure();

mlir/test/Conversion/OpenMPToLLVM/convert-to-llvmir.mlir

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ func.func @atomic_update() {
133133
%1 = arith.constant 1 : i32
134134
%2 = arith.addi %arg0, %1 : i32
135135
omp.yield(%2 : i32)
136-
}
136+
} {atomic_control = #omp.atomic_control<>}
137137
return
138138
}
139139
llvm.mlir.global internal @_QFsEc() : i32 {

mlir/test/Dialect/OpenMP/canonicalize.mlir

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ func.func @update_no_op(%x : memref<i32>) {
44
omp.atomic.update %x : memref<i32> {
55
^bb0(%xval : i32):
66
omp.yield(%xval : i32)
7-
}
7+
} {atomic_control = #omp.atomic_control<>}
88
return
99
}
1010

@@ -17,7 +17,7 @@ func.func @update_write_op(%x : memref<i32>, %value: i32) {
1717
omp.atomic.update %x : memref<i32> {
1818
^bb0(%xval : i32):
1919
omp.yield(%value : i32)
20-
}
20+
} {atomic_control = #omp.atomic_control<>}
2121
return
2222
}
2323

@@ -33,7 +33,7 @@ func.func @update_normal(%x : memref<i32>, %value: i32) {
3333
^bb0(%xval : i32):
3434
%newval = arith.addi %xval, %value : i32
3535
omp.yield(%newval : i32)
36-
}
36+
} {atomic_control = #omp.atomic_control<>}
3737
return
3838
}
3939

@@ -50,7 +50,7 @@ func.func @update_unnecessary_computations(%x: memref<i32>) {
5050
^bb0(%xval: i32):
5151
%newval = arith.addi %xval, %c0 : i32
5252
omp.yield(%newval: i32)
53-
}
53+
} {atomic_control = #omp.atomic_control<>}
5454
return
5555
}
5656

@@ -65,7 +65,7 @@ func.func @update_unnecessary_computations(%x: memref<i32>) {
6565
^bb0(%xval: i32):
6666
%newval = arith.muli %xval, %c0 : i32
6767
omp.yield(%newval: i32)
68-
}
68+
} {atomic_control = #omp.atomic_control<>}
6969
return
7070
}
7171

0 commit comments

Comments
 (0)