[flang-commits] [clang] [flang] [llvm] [mlir] Atomic control backend (PR #143769)
via flang-commits
flang-commits at lists.llvm.org
Wed Jun 11 14:35:49 PDT 2025
github-actions[bot] wrote:
<!--LLVM CODE FORMAT COMMENT: {clang-format}-->
:warning: C/C++ code formatter, clang-format found issues in your code. :warning:
<details>
<summary>
You can test this locally with the following command:
</summary>
``````````bash
git-clang-format --diff HEAD~1 HEAD --extensions cpp,h -- flang/include/flang/Frontend/TargetOptions.h flang/include/flang/Optimizer/Dialect/Support/FIRContext.h flang/lib/Frontend/CompilerInvocation.cpp flang/lib/Lower/Bridge.cpp flang/lib/Lower/OpenMP/OpenMP.cpp flang/lib/Optimizer/Dialect/Support/FIRContext.cpp llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
``````````
</details>
<details>
<summary>
View the diff from clang-format here.
</summary>
``````````diff
diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp
index de9d81e6d..662e3360a 100644
--- a/flang/lib/Lower/OpenMP/OpenMP.cpp
+++ b/flang/lib/Lower/OpenMP/OpenMP.cpp
@@ -2851,13 +2851,14 @@ genAtomicUpdate(lower::AbstractConverter &converter, mlir::Location loc,
}
mlir::ModuleOp module = builder.getModule();
- mlir::omp::AtomicControlAttr atomicControlAttr = mlir::omp::AtomicControlAttr::get(
- builder.getContext(), fir::getAmdgpuIgnoreDenormalMode(module),
- fir::getAmdgpuFineGrainedMemory(module),
- fir::getAmdgpuRemoteMemory(module));
+ mlir::omp::AtomicControlAttr atomicControlAttr =
+ mlir::omp::AtomicControlAttr::get(
+ builder.getContext(), fir::getAmdgpuIgnoreDenormalMode(module),
+ fir::getAmdgpuFineGrainedMemory(module),
+ fir::getAmdgpuRemoteMemory(module));
builder.restoreInsertionPoint(atomicAt);
- auto updateOp =
- builder.create<mlir::omp::AtomicUpdateOp>(loc, atomAddr, atomicControlAttr, hint, memOrder);
+ auto updateOp = builder.create<mlir::omp::AtomicUpdateOp>(
+ loc, atomAddr, atomicControlAttr, hint, memOrder);
mlir::Region ®ion = updateOp->getRegion(0);
mlir::Block *block = builder.createBlock(®ion, {}, {atomType}, {loc});
diff --git a/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h b/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
index 0887719b4..4112aedef 100644
--- a/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
+++ b/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
@@ -3279,7 +3279,8 @@ private:
AtomicOrdering AO, AtomicRMWInst::BinOp RMWOp,
AtomicUpdateCallbackTy &UpdateOp, bool VolatileX,
bool IsXBinopExpr, bool IsAmdgpuIgnoreDenormalMode,
- bool IsAmdgpuNoFineGrainedMemory, bool IsAmdgpuNoRemoteMemory);
+ bool IsAmdgpuNoFineGrainedMemory,
+ bool IsAmdgpuNoRemoteMemory);
/// Emit the binary op. described by \p RMWOp, using \p Src1 and \p Src2 .
///
@@ -3352,7 +3353,8 @@ public:
Value *Expr, AtomicOrdering AO, AtomicRMWInst::BinOp RMWOp,
AtomicUpdateCallbackTy &UpdateOp, bool IsXBinopExpr,
bool IsAmdgpuIgnoreDenormalMode = false,
- bool IsAmdgpuNoFineGrainedMemory = false, bool IsAmdgpuNoRemoteMemory = false);
+ bool IsAmdgpuNoFineGrainedMemory = false,
+ bool IsAmdgpuNoRemoteMemory = false);
/// Emit atomic update for constructs: --- Only Scalar data types
/// V = X; X = X BinOp Expr ,
@@ -3389,7 +3391,8 @@ public:
AtomicRMWInst::BinOp RMWOp, AtomicUpdateCallbackTy &UpdateOp,
bool UpdateExpr, bool IsPostfixUpdate, bool IsXBinopExpr,
bool IsAmdgpuIgnoreDenormalMode = false,
- bool IsAmdgpuNoFineGrainedMemory = false, bool IsAmdgpuNoRemoteMemory = false);
+ bool IsAmdgpuNoFineGrainedMemory = false,
+ bool IsAmdgpuNoRemoteMemory = false);
/// Emit atomic compare for constructs: --- Only scalar data types
/// cond-expr-stmt:
diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
index ecc3c6203..21ad9e97b 100644
--- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
+++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
@@ -8761,8 +8761,9 @@ OpenMPIRBuilder::createAtomicWrite(const LocationDescription &Loc,
OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createAtomicUpdate(
const LocationDescription &Loc, InsertPointTy AllocaIP, AtomicOpValue &X,
Value *Expr, AtomicOrdering AO, AtomicRMWInst::BinOp RMWOp,
- AtomicUpdateCallbackTy &UpdateOp, bool IsXBinopExpr, bool IsAmdgpuIgnoreDenormalMode,
- bool IsNoFineGrainedMemory, bool IsNoRemoteMemory) {
+ AtomicUpdateCallbackTy &UpdateOp, bool IsXBinopExpr,
+ bool IsAmdgpuIgnoreDenormalMode, bool IsNoFineGrainedMemory,
+ bool IsNoRemoteMemory) {
assert(!isConflictIP(Loc.IP, AllocaIP) && "IPs must not be ambiguous");
if (!updateToLocation(Loc))
return Loc.IP;
@@ -8782,7 +8783,8 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createAtomicUpdate(
Expected<std::pair<Value *, Value *>> AtomicResult =
emitAtomicUpdate(AllocaIP, X.Var, X.ElemTy, Expr, AO, RMWOp, UpdateOp,
- X.IsVolatile, IsXBinopExpr, IsAmdgpuIgnoreDenormalMode, IsNoFineGrainedMemory, IsNoRemoteMemory);
+ X.IsVolatile, IsXBinopExpr, IsAmdgpuIgnoreDenormalMode,
+ IsNoFineGrainedMemory, IsNoRemoteMemory);
if (!AtomicResult)
return AtomicResult.takeError();
checkAndEmitFlushAfterAtomic(Loc, AO, AtomicKind::Update);
@@ -8829,8 +8831,9 @@ Value *OpenMPIRBuilder::emitRMWOpAsInstruction(Value *Src1, Value *Src2,
Expected<std::pair<Value *, Value *>> OpenMPIRBuilder::emitAtomicUpdate(
InsertPointTy AllocaIP, Value *X, Type *XElemTy, Value *Expr,
AtomicOrdering AO, AtomicRMWInst::BinOp RMWOp,
- AtomicUpdateCallbackTy &UpdateOp, bool VolatileX, bool IsXBinopExpr, bool IsAmdgpuIgnoreDenormalMode,
- bool IsAmdgpuNoFineGrainedMemory, bool IsAmdgpuNoRemoteMemory) {
+ AtomicUpdateCallbackTy &UpdateOp, bool VolatileX, bool IsXBinopExpr,
+ bool IsAmdgpuIgnoreDenormalMode, bool IsAmdgpuNoFineGrainedMemory,
+ bool IsAmdgpuNoRemoteMemory) {
// TODO: handle the case where XElemTy is not byte-sized or not a power of 2
// or a complex datatype.
bool emitRMWOp = false;
@@ -8853,16 +8856,17 @@ Expected<std::pair<Value *, Value *>> OpenMPIRBuilder::emitAtomicUpdate(
std::pair<Value *, Value *> Res;
if (emitRMWOp) {
- AtomicRMWInst *atomicRMWInst = Builder.CreateAtomicRMW(RMWOp, X, Expr, llvm::MaybeAlign(), AO);
- if(IsAmdgpuIgnoreDenormalMode)
+ AtomicRMWInst *atomicRMWInst =
+ Builder.CreateAtomicRMW(RMWOp, X, Expr, llvm::MaybeAlign(), AO);
+ if (IsAmdgpuIgnoreDenormalMode)
atomicRMWInst->setMetadata("amdgpu.ignore.denormal.mode",
- llvm::MDNode::get(Builder.getContext(), {}));
- if(IsAmdgpuNoFineGrainedMemory)
+ llvm::MDNode::get(Builder.getContext(), {}));
+ if (IsAmdgpuNoFineGrainedMemory)
atomicRMWInst->setMetadata("amdgpu.no.fine.grained.memory",
- llvm::MDNode::get(Builder.getContext(), {}));
- if(IsAmdgpuNoRemoteMemory)
+ llvm::MDNode::get(Builder.getContext(), {}));
+ if (IsAmdgpuNoRemoteMemory)
atomicRMWInst->setMetadata("amdgpu.no.remote.memory",
- llvm::MDNode::get(Builder.getContext(), {}));
+ llvm::MDNode::get(Builder.getContext(), {}));
Res.first = atomicRMWInst;
// not needed except in case of postfix captures. Generate anyway for
// consistency with the else part. Will be removed with any DCE pass.
@@ -8995,8 +8999,9 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createAtomicCapture(
const LocationDescription &Loc, InsertPointTy AllocaIP, AtomicOpValue &X,
AtomicOpValue &V, Value *Expr, AtomicOrdering AO,
AtomicRMWInst::BinOp RMWOp, AtomicUpdateCallbackTy &UpdateOp,
- bool UpdateExpr, bool IsPostfixUpdate, bool IsXBinopExpr, bool IsAmdgpuIgnoreDenormalMode,
- bool IsAmdgpuNoFineGrainedMemory, bool IsAmdgpuNoRemoteMemory) {
+ bool UpdateExpr, bool IsPostfixUpdate, bool IsXBinopExpr,
+ bool IsAmdgpuIgnoreDenormalMode, bool IsAmdgpuNoFineGrainedMemory,
+ bool IsAmdgpuNoRemoteMemory) {
if (!updateToLocation(Loc))
return Loc.IP;
@@ -9017,7 +9022,8 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createAtomicCapture(
AtomicRMWInst::BinOp AtomicOp = (UpdateExpr ? RMWOp : AtomicRMWInst::Xchg);
Expected<std::pair<Value *, Value *>> AtomicResult =
emitAtomicUpdate(AllocaIP, X.Var, X.ElemTy, Expr, AO, AtomicOp, UpdateOp,
- X.IsVolatile, IsXBinopExpr, IsAmdgpuIgnoreDenormalMode, IsAmdgpuNoFineGrainedMemory, IsAmdgpuNoRemoteMemory);
+ X.IsVolatile, IsXBinopExpr, IsAmdgpuIgnoreDenormalMode,
+ IsAmdgpuNoFineGrainedMemory, IsAmdgpuNoRemoteMemory);
if (!AtomicResult)
return AtomicResult.takeError();
Value *CapturedVal =
diff --git a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
index 5e9cd26c8..9d7a7c644 100644
--- a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
@@ -3166,18 +3166,21 @@ convertOmpAtomicUpdate(omp::AtomicUpdateOp &opInst,
return moduleTranslation.lookupValue(yieldop.getResults()[0]);
};
- mlir::omp::AtomicControlAttr atomicControlAttr = opInst.getAtomicControlAttr();
- bool isAmdgpuIgnoreDenormalMode = atomicControlAttr.getAmdgpuIgnoreDenormalMode();
- bool isAmdgpuNoFineGrainedMemory = !atomicControlAttr.getAmdgpuFineGrainedMemory();
- bool isAmdgpuNoRemoteMemory = !atomicControlAttr.getAmdgpuRemoteMemory();
+ mlir::omp::AtomicControlAttr atomicControlAttr =
+ opInst.getAtomicControlAttr();
+ bool isAmdgpuIgnoreDenormalMode =
+ atomicControlAttr.getAmdgpuIgnoreDenormalMode();
+ bool isAmdgpuNoFineGrainedMemory =
+ !atomicControlAttr.getAmdgpuFineGrainedMemory();
+ bool isAmdgpuNoRemoteMemory = !atomicControlAttr.getAmdgpuRemoteMemory();
// Handle ambiguous alloca, if any.
auto allocaIP = findAllocaInsertPoint(builder, moduleTranslation);
llvm::OpenMPIRBuilder::LocationDescription ompLoc(builder);
llvm::OpenMPIRBuilder::InsertPointOrErrorTy afterIP =
- ompBuilder->createAtomicUpdate(ompLoc, allocaIP, llvmAtomicX, llvmExpr,
- atomicOrdering, binop, updateFn,
- isXBinopExpr, isAmdgpuIgnoreDenormalMode, isAmdgpuNoFineGrainedMemory, isAmdgpuNoRemoteMemory);
-
+ ompBuilder->createAtomicUpdate(
+ ompLoc, allocaIP, llvmAtomicX, llvmExpr, atomicOrdering, binop,
+ updateFn, isXBinopExpr, isAmdgpuIgnoreDenormalMode,
+ isAmdgpuNoFineGrainedMemory, isAmdgpuNoRemoteMemory);
if (failed(handleError(afterIP, *opInst)))
return failure();
@@ -3270,11 +3273,14 @@ convertOmpAtomicCapture(omp::AtomicCaptureOp atomicCaptureOp,
bool isAmdgpuIgnoreDenormalMode = false;
bool isAmdgpuNoFineGrainedMemory = true;
bool isAmdgpuNoRemoteMemory = true;
- if(atomicUpdateOp) {
- mlir::omp::AtomicControlAttr atomicControlAttr = atomicUpdateOp.getAtomicControlAttr();
- isAmdgpuIgnoreDenormalMode = atomicControlAttr.getAmdgpuIgnoreDenormalMode();
- isAmdgpuNoFineGrainedMemory = !atomicControlAttr.getAmdgpuFineGrainedMemory();
- isAmdgpuNoRemoteMemory = !atomicControlAttr.getAmdgpuRemoteMemory();
+ if (atomicUpdateOp) {
+ mlir::omp::AtomicControlAttr atomicControlAttr =
+ atomicUpdateOp.getAtomicControlAttr();
+ isAmdgpuIgnoreDenormalMode =
+ atomicControlAttr.getAmdgpuIgnoreDenormalMode();
+ isAmdgpuNoFineGrainedMemory =
+ !atomicControlAttr.getAmdgpuFineGrainedMemory();
+ isAmdgpuNoRemoteMemory = !atomicControlAttr.getAmdgpuRemoteMemory();
}
// Handle ambiguous alloca, if any.
auto allocaIP = findAllocaInsertPoint(builder, moduleTranslation);
@@ -3282,8 +3288,9 @@ convertOmpAtomicCapture(omp::AtomicCaptureOp atomicCaptureOp,
llvm::OpenMPIRBuilder::InsertPointOrErrorTy afterIP =
ompBuilder->createAtomicCapture(
ompLoc, allocaIP, llvmAtomicX, llvmAtomicV, llvmExpr, atomicOrdering,
- binop, updateFn, atomicUpdateOp, isPostfixUpdate,
- isXBinopExpr, isAmdgpuIgnoreDenormalMode, isAmdgpuNoFineGrainedMemory, isAmdgpuNoRemoteMemory);
+ binop, updateFn, atomicUpdateOp, isPostfixUpdate, isXBinopExpr,
+ isAmdgpuIgnoreDenormalMode, isAmdgpuNoFineGrainedMemory,
+ isAmdgpuNoRemoteMemory);
if (failed(handleError(afterIP, *atomicCaptureOp)))
return failure();
``````````
</details>
https://github.com/llvm/llvm-project/pull/143769
More information about the flang-commits
mailing list