[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 &region = updateOp->getRegion(0);
   mlir::Block *block = builder.createBlock(&region, {}, {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