Skip to content

Revert "[flang][flang-driver][mlir][OpenMP] atomic control support" #150504

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jul 24, 2025

Conversation

kiranchandramohan
Copy link
Contributor

@llvmbot llvmbot added clang Clang issues not falling into any other category flang:driver mlir flang Flang issues not falling into any other category mlir:openmp flang:fir-hlfir flang:openmp labels Jul 24, 2025
@llvmbot
Copy link
Member

llvmbot commented Jul 24, 2025

@llvm/pr-subscribers-mlir-openmp
@llvm/pr-subscribers-flang-openmp
@llvm/pr-subscribers-mlir

@llvm/pr-subscribers-flang-driver

Author: Kiran Chandramohan (kiranchandramohan)

Changes

Reverts llvm/llvm-project#143441

Reverting due to CI failure https://lab.llvm.org/buildbot/#/builders/53/builds/18055.


Full diff: https://github.com/llvm/llvm-project/pull/150504.diff

11 Files Affected:

  • (modified) clang/include/clang/Driver/Options.td (+11-11)
  • (modified) flang/include/flang/Frontend/TargetOptions.h (-5)
  • (modified) flang/include/flang/Optimizer/Dialect/Support/FIRContext.h (-19)
  • (modified) flang/lib/Frontend/CompilerInvocation.cpp (-10)
  • (modified) flang/lib/Lower/Bridge.cpp (-4)
  • (modified) flang/lib/Lower/OpenMP/Atomic.cpp (+1-8)
  • (modified) flang/lib/Optimizer/Dialect/Support/FIRContext.cpp (-51)
  • (removed) flang/test/Lower/OpenMP/atomic-control-options.f90 (-37)
  • (modified) mlir/include/mlir/Dialect/OpenMP/OpenMPAttrDefs.td (-15)
  • (modified) mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td (+3-5)
  • (modified) mlir/test/Dialect/OpenMP/ops.mlir (+1-9)
diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td
index fa248381583cd..916400efdb449 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -2320,21 +2320,21 @@ def fsymbol_partition_EQ : Joined<["-"], "fsymbol-partition=">, Group<f_Group>,
 
 defm atomic_remote_memory : BoolFOption<"atomic-remote-memory",
   LangOpts<"AtomicRemoteMemory">, DefaultFalse,
-  PosFlag<SetTrue, [], [ClangOption, CC1Option, FlangOption, FC1Option], "May have">,
-  NegFlag<SetFalse, [], [ClangOption, FlangOption], "Assume no">,
-  BothFlags<[], [ClangOption, FlangOption], " atomic operations on remote memory">>;
+  PosFlag<SetTrue, [], [ClangOption, CC1Option], "May have">,
+  NegFlag<SetFalse, [], [ClangOption], "Assume no">,
+  BothFlags<[], [ClangOption], " atomic operations on remote memory">>;
 
 defm atomic_fine_grained_memory : BoolFOption<"atomic-fine-grained-memory",
   LangOpts<"AtomicFineGrainedMemory">, DefaultFalse,
-  PosFlag<SetTrue, [], [ClangOption, CC1Option, FlangOption, FC1Option], "May have">,
-  NegFlag<SetFalse, [], [ClangOption, FlangOption], "Assume no">,
-  BothFlags<[], [ClangOption, FlangOption], " atomic operations on fine-grained memory">>;
+  PosFlag<SetTrue, [], [ClangOption, CC1Option], "May have">,
+  NegFlag<SetFalse, [], [ClangOption], "Assume no">,
+  BothFlags<[], [ClangOption], " atomic operations on fine-grained memory">>;
 
 defm atomic_ignore_denormal_mode : BoolFOption<"atomic-ignore-denormal-mode",
   LangOpts<"AtomicIgnoreDenormalMode">, DefaultFalse,
-  PosFlag<SetTrue, [], [ClangOption, CC1Option, FlangOption, FC1Option], "Allow">,
-  NegFlag<SetFalse, [], [ClangOption, FlangOption], "Disallow">,
-  BothFlags<[], [ClangOption, FlangOption], " atomic operations to ignore denormal mode">>;
+  PosFlag<SetTrue, [], [ClangOption, CC1Option], "Allow">,
+  NegFlag<SetFalse, [], [ClangOption], "Disallow">,
+  BothFlags<[], [ClangOption], " atomic operations to ignore denormal mode">>;
 
 defm memory_profile : OptInCC1FFlag<"memory-profile", "Enable", "Disable", " heap memory profiling">;
 def fmemory_profile_EQ : Joined<["-"], "fmemory-profile=">,
@@ -5360,9 +5360,9 @@ defm amdgpu_precise_memory_op
                   " precise memory mode (AMDGPU only)">;
 
 def munsafe_fp_atomics : Flag<["-"], "munsafe-fp-atomics">,
-  Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>, Alias<fatomic_ignore_denormal_mode>;
+  Visibility<[ClangOption, CC1Option]>, Alias<fatomic_ignore_denormal_mode>;
 def mno_unsafe_fp_atomics : Flag<["-"], "mno-unsafe-fp-atomics">,
-  Visibility<[ClangOption, FlangOption]>, Alias<fno_atomic_ignore_denormal_mode>;
+  Visibility<[ClangOption]>, Alias<fno_atomic_ignore_denormal_mode>;
 
 def faltivec : Flag<["-"], "faltivec">, Group<f_Group>;
 def fno_altivec : Flag<["-"], "fno-altivec">, Group<f_Group>;
diff --git a/flang/include/flang/Frontend/TargetOptions.h b/flang/include/flang/Frontend/TargetOptions.h
index f6e5634d5a995..002d8d158abd4 100644
--- a/flang/include/flang/Frontend/TargetOptions.h
+++ b/flang/include/flang/Frontend/TargetOptions.h
@@ -53,11 +53,6 @@ class TargetOptions {
 
   /// Print verbose assembly
   bool asmVerbose = false;
-
-  /// Atomic control options
-  bool atomicIgnoreDenormalMode = false;
-  bool atomicRemoteMemory = false;
-  bool atomicFineGrainedMemory = false;
 };
 
 } // end namespace Fortran::frontend
diff --git a/flang/include/flang/Optimizer/Dialect/Support/FIRContext.h b/flang/include/flang/Optimizer/Dialect/Support/FIRContext.h
index c0c0b744206cd..2df14f83c11e1 100644
--- a/flang/include/flang/Optimizer/Dialect/Support/FIRContext.h
+++ b/flang/include/flang/Optimizer/Dialect/Support/FIRContext.h
@@ -58,25 +58,6 @@ void setTargetCPU(mlir::ModuleOp mod, llvm::StringRef cpu);
 /// Get the target CPU string from the Module or return a null reference.
 llvm::StringRef getTargetCPU(mlir::ModuleOp mod);
 
-/// Sets whether Denormal Mode can be ignored or not for lowering of floating
-/// point atomic operations.
-void setAtomicIgnoreDenormalMode(mlir::ModuleOp mod, bool value);
-/// Gets whether Denormal Mode can be ignored or not for lowering of floating
-/// point atomic operations.
-bool getAtomicIgnoreDenormalMode(mlir::ModuleOp mod);
-/// Sets whether fine grained memory can be used or not for lowering of atomic
-/// operations.
-void setAtomicFineGrainedMemory(mlir::ModuleOp mod, bool value);
-/// Gets whether fine grained memory can be used or not for lowering of atomic
-/// operations.
-bool getAtomicFineGrainedMemory(mlir::ModuleOp mod);
-/// Sets whether remote memory can be used or not for lowering of atomic
-/// operations.
-void setAtomicRemoteMemory(mlir::ModuleOp mod, bool value);
-/// Gets whether remote memory can be used or not for lowering of atomic
-/// operations.
-bool getAtomicRemoteMemory(mlir::ModuleOp mod);
-
 /// Set the tune CPU for the module. `cpu` must not be deallocated while
 /// module `mod` is still live.
 void setTuneCPU(mlir::ModuleOp mod, llvm::StringRef cpu);
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp
index 111c5aa48726f..f55d866435997 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -512,16 +512,6 @@ static void parseTargetArgs(TargetOptions &opts, llvm::opt::ArgList &args) {
           args.getLastArg(clang::driver::options::OPT_triple))
     opts.triple = a->getValue();
 
-  opts.atomicIgnoreDenormalMode = args.hasFlag(
-      clang::driver::options::OPT_fatomic_ignore_denormal_mode,
-      clang::driver::options::OPT_fno_atomic_ignore_denormal_mode, false);
-  opts.atomicFineGrainedMemory = args.hasFlag(
-      clang::driver::options::OPT_fatomic_fine_grained_memory,
-      clang::driver::options::OPT_fno_atomic_fine_grained_memory, false);
-  opts.atomicRemoteMemory =
-      args.hasFlag(clang::driver::options::OPT_fatomic_remote_memory,
-                   clang::driver::options::OPT_fno_atomic_remote_memory, false);
-
   if (const llvm::opt::Arg *a =
           args.getLastArg(clang::driver::options::OPT_target_cpu))
     opts.cpu = a->getValue();
diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp
index ac3669c907fbc..92aae792248c5 100644
--- a/flang/lib/Lower/Bridge.cpp
+++ b/flang/lib/Lower/Bridge.cpp
@@ -6733,10 +6733,6 @@ Fortran::lower::LoweringBridge::LoweringBridge(
   fir::setKindMapping(*module, kindMap);
   fir::setTargetCPU(*module, targetMachine.getTargetCPU());
   fir::setTuneCPU(*module, targetOpts.cpuToTuneFor);
-  fir::setAtomicIgnoreDenormalMode(*module,
-                                   targetOpts.atomicIgnoreDenormalMode);
-  fir::setAtomicFineGrainedMemory(*module, targetOpts.atomicFineGrainedMemory);
-  fir::setAtomicRemoteMemory(*module, targetOpts.atomicRemoteMemory);
   fir::setTargetFeatures(*module, targetMachine.getTargetFeatureString());
   fir::support::setMLIRDataLayout(*module, targetMachine.createDataLayout());
   fir::setIdent(*module, Fortran::common::getFlangFullVersion());
diff --git a/flang/lib/Lower/OpenMP/Atomic.cpp b/flang/lib/Lower/OpenMP/Atomic.cpp
index d4f83f57bd5d4..9a233d2d8cb08 100644
--- a/flang/lib/Lower/OpenMP/Atomic.cpp
+++ b/flang/lib/Lower/OpenMP/Atomic.cpp
@@ -635,16 +635,9 @@ genAtomicUpdate(lower::AbstractConverter &converter,
     }
   }
 
-  mlir::ModuleOp module = builder.getModule();
-  mlir::omp::AtomicControlAttr atomicControlAttr =
-      mlir::omp::AtomicControlAttr::get(
-          builder.getContext(), fir::getAtomicIgnoreDenormalMode(module),
-          fir::getAtomicFineGrainedMemory(module),
-          fir::getAtomicRemoteMemory(module));
   builder.restoreInsertionPoint(atomicAt);
   auto updateOp = mlir::omp::AtomicUpdateOp::create(
-      builder, loc, atomAddr, atomicControlAttr, hint,
-      makeMemOrderAttr(converter, memOrder));
+      builder, loc, atomAddr, hint, makeMemOrderAttr(converter, memOrder));
 
   mlir::Region &region = updateOp->getRegion(0);
   mlir::Block *block = builder.createBlock(&region, {}, {atomType}, {loc});
diff --git a/flang/lib/Optimizer/Dialect/Support/FIRContext.cpp b/flang/lib/Optimizer/Dialect/Support/FIRContext.cpp
index c2e0afe122b4e..01c0be66d1ecc 100644
--- a/flang/lib/Optimizer/Dialect/Support/FIRContext.cpp
+++ b/flang/lib/Optimizer/Dialect/Support/FIRContext.cpp
@@ -88,57 +88,6 @@ void fir::setTuneCPU(mlir::ModuleOp mod, llvm::StringRef cpu) {
   mod->setAttr(tuneCpuName, mlir::StringAttr::get(ctx, cpu));
 }
 
-static constexpr const char *atomicIgnoreDenormalModeName =
-    "fir.atomic_ignore_denormal_mode";
-
-void fir::setAtomicIgnoreDenormalMode(mlir::ModuleOp mod, bool value) {
-  if (value) {
-    auto *ctx = mod.getContext();
-    mod->setAttr(atomicIgnoreDenormalModeName, mlir::UnitAttr::get(ctx));
-  } else {
-    if (mod->hasAttr(atomicIgnoreDenormalModeName))
-      mod->removeAttr(atomicIgnoreDenormalModeName);
-  }
-}
-
-bool fir::getAtomicIgnoreDenormalMode(mlir::ModuleOp mod) {
-  return mod->hasAttr(atomicIgnoreDenormalModeName);
-}
-
-static constexpr const char *atomicFineGrainedMemoryName =
-    "fir.atomic_fine_grained_memory";
-
-void fir::setAtomicFineGrainedMemory(mlir::ModuleOp mod, bool value) {
-  if (value) {
-    auto *ctx = mod.getContext();
-    mod->setAttr(atomicFineGrainedMemoryName, mlir::UnitAttr::get(ctx));
-  } else {
-    if (mod->hasAttr(atomicFineGrainedMemoryName))
-      mod->removeAttr(atomicFineGrainedMemoryName);
-  }
-}
-
-bool fir::getAtomicFineGrainedMemory(mlir::ModuleOp mod) {
-  return mod->hasAttr(atomicFineGrainedMemoryName);
-}
-
-static constexpr const char *atomicRemoteMemoryName =
-    "fir.atomic_remote_memory";
-
-void fir::setAtomicRemoteMemory(mlir::ModuleOp mod, bool value) {
-  if (value) {
-    auto *ctx = mod.getContext();
-    mod->setAttr(atomicRemoteMemoryName, mlir::UnitAttr::get(ctx));
-  } else {
-    if (mod->hasAttr(atomicRemoteMemoryName))
-      mod->removeAttr(atomicRemoteMemoryName);
-  }
-}
-
-bool fir::getAtomicRemoteMemory(mlir::ModuleOp mod) {
-  return mod->hasAttr(atomicRemoteMemoryName);
-}
-
 llvm::StringRef fir::getTuneCPU(mlir::ModuleOp mod) {
   if (auto attr = mod->getAttrOfType<mlir::StringAttr>(tuneCpuName))
     return attr.getValue();
diff --git a/flang/test/Lower/OpenMP/atomic-control-options.f90 b/flang/test/Lower/OpenMP/atomic-control-options.f90
deleted file mode 100644
index 8f86a151b3713..0000000000000
--- a/flang/test/Lower/OpenMP/atomic-control-options.f90
+++ /dev/null
@@ -1,37 +0,0 @@
-! RUN: %flang_fc1 -emit-hlfir -triple amdgcn-amd-amdhsa -fopenmp -fopenmp-is-device -munsafe-fp-atomics %s -o - | FileCheck -check-prefix=UNSAFE-FP-ATOMICS %s
-! RUN: %flang_fc1 -emit-hlfir -triple amdgcn-amd-amdhsa -fopenmp -fopenmp-is-device -fatomic-ignore-denormal-mode %s -o - | FileCheck -check-prefix=IGNORE-DENORMAL %s
-! RUN: %flang_fc1 -emit-hlfir -triple amdgcn-amd-amdhsa -fopenmp -fopenmp-is-device -fatomic-fine-grained-memory %s -o - | FileCheck -check-prefix=FINE-GRAINED-MEMORY %s
-! RUN: %flang_fc1 -emit-hlfir -triple amdgcn-amd-amdhsa -fopenmp -fopenmp-is-device -fatomic-remote-memory %s -o - | FileCheck -check-prefix=REMOTE-MEMORY %s
-program test
-    implicit none
-    integer :: A, B, threads
-    threads = 128
-    A = 0
-    B = 0
-    !UNSAFE-FP-ATOMICS: omp.atomic.update %{{.*}} : !fir.ref<i32> {
-    !UNSAFE-FP-ATOMICS: } {atomic_control = #omp.atomic_control<ignore_denormal_mode = true>}
-    !IGNORE-DENORMAL: omp.atomic.update %{{.*}} : !fir.ref<i32> {
-    !IGNORE-DENORMAL: } {atomic_control = #omp.atomic_control<ignore_denormal_mode = true>}
-    !FINE-GRAINED-MEMORY: omp.atomic.update %{{.*}} : !fir.ref<i32> {
-    !FINE-GRAINED-MEMORY: } {atomic_control = #omp.atomic_control<fine_grained_memory = true>}
-    !REMOTE-MEMORY: omp.atomic.update %{{.*}} : !fir.ref<i32> {
-    !REMOTE-MEMORY: } {atomic_control = #omp.atomic_control<remote_memory = true>}
-    !$omp target parallel num_threads(threads)
-    !$omp atomic
-    A =  A + 1
-    !$omp end target parallel
-    !UNSAFE-FP-ATOMICS: omp.atomic.update %{{.*}} : !fir.ref<i32> {
-    !UNSAFE-FP-ATOMICS: } {atomic_control = #omp.atomic_control<ignore_denormal_mode = true>}
-    !IGNORE-DENORMAL: omp.atomic.update %{{.*}} : !fir.ref<i32> {
-    !IGNORE-DENORMAL: } {atomic_control = #omp.atomic_control<ignore_denormal_mode = true>}
-    !FINE-GRAINED-MEMORY: omp.atomic.update %{{.*}} : !fir.ref<i32> {
-    !FINE-GRAINED-MEMORY: } {atomic_control = #omp.atomic_control<fine_grained_memory = true>}
-    !REMOTE-MEMORY: omp.atomic.update %{{.*}} : !fir.ref<i32> {
-    !REMOTE-MEMORY: } {atomic_control = #omp.atomic_control<remote_memory = true>}
-    !$omp target parallel num_threads(threads)
-    !$omp atomic capture
-        A = A + B
-        B = A
-    !$omp end atomic
-    !$omp end target parallel
-end program test
diff --git a/mlir/include/mlir/Dialect/OpenMP/OpenMPAttrDefs.td b/mlir/include/mlir/Dialect/OpenMP/OpenMPAttrDefs.td
index 72ce4c6a21cb3..704d0b2220e8a 100644
--- a/mlir/include/mlir/Dialect/OpenMP/OpenMPAttrDefs.td
+++ b/mlir/include/mlir/Dialect/OpenMP/OpenMPAttrDefs.td
@@ -22,21 +22,6 @@ class OpenMP_Attr<string name, string attrMnemonic, list<Trait> traits = [],
   let mnemonic = attrMnemonic;
 }
 
-//===----------------------------------------------------------------------===//
-// AtomicControlAttr
-//===----------------------------------------------------------------------===//
-
-// Atomic control attributes hold information about architectural
-// characteristics which are required for lowering atomic operations.
-def AtomicControlAttr : OpenMP_Attr<"AtomicControl", "atomic_control"> {
-  let parameters =
-      (ins DefaultValuedParameter<"bool", "false">:$ignore_denormal_mode,
-          DefaultValuedParameter<"bool", "false">:$fine_grained_memory,
-          DefaultValuedParameter<"bool", "false">:$remote_memory);
-
-  let assemblyFormat = "`<` struct(params) `>`";
-}
-
 //===----------------------------------------------------------------------===//
 // DeclareTargetAttr
 //===----------------------------------------------------------------------===//
diff --git a/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td b/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td
index be114ea4fb631..8cf18b43450ab 100644
--- a/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td
+++ b/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td
@@ -1750,11 +1750,9 @@ def AtomicUpdateOp : OpenMP_Op<"atomic.update", traits = [
     operations.
   }] # clausesDescription;
 
-  let arguments = !con(
-      (ins Arg<OpenMP_PointerLikeType,
-               "Address of variable to be updated", [MemRead, MemWrite]>:$x,
-          OptionalAttr<AtomicControlAttr>:$atomic_control),
-      clausesArgs);
+  let arguments = !con((ins Arg<OpenMP_PointerLikeType,
+                                "Address of variable to be updated",
+                                [MemRead, MemWrite]>:$x), clausesArgs);
 
   // Override region definition.
   let regions = (region SizedRegion<1>:$region);
diff --git a/mlir/test/Dialect/OpenMP/ops.mlir b/mlir/test/Dialect/OpenMP/ops.mlir
index 8c846cde1a3ca..4c50ed3230976 100644
--- a/mlir/test/Dialect/OpenMP/ops.mlir
+++ b/mlir/test/Dialect/OpenMP/ops.mlir
@@ -1406,7 +1406,7 @@ func.func @omp_atomic_update(%x : memref<i32>, %expr : i32, %xBool : memref<i1>,
   // CHECK-NEXT: (%[[XVAL:.*]]: i1):
   // CHECK-NEXT:   %[[NEWVAL:.*]] = llvm.icmp "eq" %[[XVAL]], %[[EXPRBOOL]] : i1
   // CHECK-NEXT:   omp.yield(%[[NEWVAL]] : i1)
-  // CHECK-NEXT: }
+  // }
   omp.atomic.update %xBool : memref<i1> {
   ^bb0(%xval: i1):
     %newval = llvm.icmp "eq" %xval, %exprBool : i1
@@ -1562,14 +1562,6 @@ func.func @omp_atomic_update(%x : memref<i32>, %expr : i32, %xBool : memref<i1>,
     omp.yield(%newval : i32)
   }
 
-  // CHECK: omp.atomic.update %[[X]] : memref<i32> {
-  // CHECK-NEXT: (%[[XVAL:.*]]: i32):
-  // CHECK-NEXT:   omp.yield(%{{.+}} : i32)
-  // CHECK-NEXT: } {atomic_control = #omp.atomic_control<ignore_denormal_mode = true, fine_grained_memory = true, remote_memory = true>}
-  omp.atomic.update %x : memref<i32> {
-  ^bb0(%xval:i32):
-    omp.yield(%const:i32)
-  } {atomic_control = #omp.atomic_control<ignore_denormal_mode = true, fine_grained_memory = true, remote_memory = true>}
   return
 }
 

@llvmbot
Copy link
Member

llvmbot commented Jul 24, 2025

@llvm/pr-subscribers-flang-fir-hlfir

Author: Kiran Chandramohan (kiranchandramohan)

Changes

Reverts llvm/llvm-project#143441

Reverting due to CI failure https://lab.llvm.org/buildbot/#/builders/53/builds/18055.


Full diff: https://github.com/llvm/llvm-project/pull/150504.diff

11 Files Affected:

  • (modified) clang/include/clang/Driver/Options.td (+11-11)
  • (modified) flang/include/flang/Frontend/TargetOptions.h (-5)
  • (modified) flang/include/flang/Optimizer/Dialect/Support/FIRContext.h (-19)
  • (modified) flang/lib/Frontend/CompilerInvocation.cpp (-10)
  • (modified) flang/lib/Lower/Bridge.cpp (-4)
  • (modified) flang/lib/Lower/OpenMP/Atomic.cpp (+1-8)
  • (modified) flang/lib/Optimizer/Dialect/Support/FIRContext.cpp (-51)
  • (removed) flang/test/Lower/OpenMP/atomic-control-options.f90 (-37)
  • (modified) mlir/include/mlir/Dialect/OpenMP/OpenMPAttrDefs.td (-15)
  • (modified) mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td (+3-5)
  • (modified) mlir/test/Dialect/OpenMP/ops.mlir (+1-9)
diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td
index fa248381583cd..916400efdb449 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -2320,21 +2320,21 @@ def fsymbol_partition_EQ : Joined<["-"], "fsymbol-partition=">, Group<f_Group>,
 
 defm atomic_remote_memory : BoolFOption<"atomic-remote-memory",
   LangOpts<"AtomicRemoteMemory">, DefaultFalse,
-  PosFlag<SetTrue, [], [ClangOption, CC1Option, FlangOption, FC1Option], "May have">,
-  NegFlag<SetFalse, [], [ClangOption, FlangOption], "Assume no">,
-  BothFlags<[], [ClangOption, FlangOption], " atomic operations on remote memory">>;
+  PosFlag<SetTrue, [], [ClangOption, CC1Option], "May have">,
+  NegFlag<SetFalse, [], [ClangOption], "Assume no">,
+  BothFlags<[], [ClangOption], " atomic operations on remote memory">>;
 
 defm atomic_fine_grained_memory : BoolFOption<"atomic-fine-grained-memory",
   LangOpts<"AtomicFineGrainedMemory">, DefaultFalse,
-  PosFlag<SetTrue, [], [ClangOption, CC1Option, FlangOption, FC1Option], "May have">,
-  NegFlag<SetFalse, [], [ClangOption, FlangOption], "Assume no">,
-  BothFlags<[], [ClangOption, FlangOption], " atomic operations on fine-grained memory">>;
+  PosFlag<SetTrue, [], [ClangOption, CC1Option], "May have">,
+  NegFlag<SetFalse, [], [ClangOption], "Assume no">,
+  BothFlags<[], [ClangOption], " atomic operations on fine-grained memory">>;
 
 defm atomic_ignore_denormal_mode : BoolFOption<"atomic-ignore-denormal-mode",
   LangOpts<"AtomicIgnoreDenormalMode">, DefaultFalse,
-  PosFlag<SetTrue, [], [ClangOption, CC1Option, FlangOption, FC1Option], "Allow">,
-  NegFlag<SetFalse, [], [ClangOption, FlangOption], "Disallow">,
-  BothFlags<[], [ClangOption, FlangOption], " atomic operations to ignore denormal mode">>;
+  PosFlag<SetTrue, [], [ClangOption, CC1Option], "Allow">,
+  NegFlag<SetFalse, [], [ClangOption], "Disallow">,
+  BothFlags<[], [ClangOption], " atomic operations to ignore denormal mode">>;
 
 defm memory_profile : OptInCC1FFlag<"memory-profile", "Enable", "Disable", " heap memory profiling">;
 def fmemory_profile_EQ : Joined<["-"], "fmemory-profile=">,
@@ -5360,9 +5360,9 @@ defm amdgpu_precise_memory_op
                   " precise memory mode (AMDGPU only)">;
 
 def munsafe_fp_atomics : Flag<["-"], "munsafe-fp-atomics">,
-  Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>, Alias<fatomic_ignore_denormal_mode>;
+  Visibility<[ClangOption, CC1Option]>, Alias<fatomic_ignore_denormal_mode>;
 def mno_unsafe_fp_atomics : Flag<["-"], "mno-unsafe-fp-atomics">,
-  Visibility<[ClangOption, FlangOption]>, Alias<fno_atomic_ignore_denormal_mode>;
+  Visibility<[ClangOption]>, Alias<fno_atomic_ignore_denormal_mode>;
 
 def faltivec : Flag<["-"], "faltivec">, Group<f_Group>;
 def fno_altivec : Flag<["-"], "fno-altivec">, Group<f_Group>;
diff --git a/flang/include/flang/Frontend/TargetOptions.h b/flang/include/flang/Frontend/TargetOptions.h
index f6e5634d5a995..002d8d158abd4 100644
--- a/flang/include/flang/Frontend/TargetOptions.h
+++ b/flang/include/flang/Frontend/TargetOptions.h
@@ -53,11 +53,6 @@ class TargetOptions {
 
   /// Print verbose assembly
   bool asmVerbose = false;
-
-  /// Atomic control options
-  bool atomicIgnoreDenormalMode = false;
-  bool atomicRemoteMemory = false;
-  bool atomicFineGrainedMemory = false;
 };
 
 } // end namespace Fortran::frontend
diff --git a/flang/include/flang/Optimizer/Dialect/Support/FIRContext.h b/flang/include/flang/Optimizer/Dialect/Support/FIRContext.h
index c0c0b744206cd..2df14f83c11e1 100644
--- a/flang/include/flang/Optimizer/Dialect/Support/FIRContext.h
+++ b/flang/include/flang/Optimizer/Dialect/Support/FIRContext.h
@@ -58,25 +58,6 @@ void setTargetCPU(mlir::ModuleOp mod, llvm::StringRef cpu);
 /// Get the target CPU string from the Module or return a null reference.
 llvm::StringRef getTargetCPU(mlir::ModuleOp mod);
 
-/// Sets whether Denormal Mode can be ignored or not for lowering of floating
-/// point atomic operations.
-void setAtomicIgnoreDenormalMode(mlir::ModuleOp mod, bool value);
-/// Gets whether Denormal Mode can be ignored or not for lowering of floating
-/// point atomic operations.
-bool getAtomicIgnoreDenormalMode(mlir::ModuleOp mod);
-/// Sets whether fine grained memory can be used or not for lowering of atomic
-/// operations.
-void setAtomicFineGrainedMemory(mlir::ModuleOp mod, bool value);
-/// Gets whether fine grained memory can be used or not for lowering of atomic
-/// operations.
-bool getAtomicFineGrainedMemory(mlir::ModuleOp mod);
-/// Sets whether remote memory can be used or not for lowering of atomic
-/// operations.
-void setAtomicRemoteMemory(mlir::ModuleOp mod, bool value);
-/// Gets whether remote memory can be used or not for lowering of atomic
-/// operations.
-bool getAtomicRemoteMemory(mlir::ModuleOp mod);
-
 /// Set the tune CPU for the module. `cpu` must not be deallocated while
 /// module `mod` is still live.
 void setTuneCPU(mlir::ModuleOp mod, llvm::StringRef cpu);
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp
index 111c5aa48726f..f55d866435997 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -512,16 +512,6 @@ static void parseTargetArgs(TargetOptions &opts, llvm::opt::ArgList &args) {
           args.getLastArg(clang::driver::options::OPT_triple))
     opts.triple = a->getValue();
 
-  opts.atomicIgnoreDenormalMode = args.hasFlag(
-      clang::driver::options::OPT_fatomic_ignore_denormal_mode,
-      clang::driver::options::OPT_fno_atomic_ignore_denormal_mode, false);
-  opts.atomicFineGrainedMemory = args.hasFlag(
-      clang::driver::options::OPT_fatomic_fine_grained_memory,
-      clang::driver::options::OPT_fno_atomic_fine_grained_memory, false);
-  opts.atomicRemoteMemory =
-      args.hasFlag(clang::driver::options::OPT_fatomic_remote_memory,
-                   clang::driver::options::OPT_fno_atomic_remote_memory, false);
-
   if (const llvm::opt::Arg *a =
           args.getLastArg(clang::driver::options::OPT_target_cpu))
     opts.cpu = a->getValue();
diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp
index ac3669c907fbc..92aae792248c5 100644
--- a/flang/lib/Lower/Bridge.cpp
+++ b/flang/lib/Lower/Bridge.cpp
@@ -6733,10 +6733,6 @@ Fortran::lower::LoweringBridge::LoweringBridge(
   fir::setKindMapping(*module, kindMap);
   fir::setTargetCPU(*module, targetMachine.getTargetCPU());
   fir::setTuneCPU(*module, targetOpts.cpuToTuneFor);
-  fir::setAtomicIgnoreDenormalMode(*module,
-                                   targetOpts.atomicIgnoreDenormalMode);
-  fir::setAtomicFineGrainedMemory(*module, targetOpts.atomicFineGrainedMemory);
-  fir::setAtomicRemoteMemory(*module, targetOpts.atomicRemoteMemory);
   fir::setTargetFeatures(*module, targetMachine.getTargetFeatureString());
   fir::support::setMLIRDataLayout(*module, targetMachine.createDataLayout());
   fir::setIdent(*module, Fortran::common::getFlangFullVersion());
diff --git a/flang/lib/Lower/OpenMP/Atomic.cpp b/flang/lib/Lower/OpenMP/Atomic.cpp
index d4f83f57bd5d4..9a233d2d8cb08 100644
--- a/flang/lib/Lower/OpenMP/Atomic.cpp
+++ b/flang/lib/Lower/OpenMP/Atomic.cpp
@@ -635,16 +635,9 @@ genAtomicUpdate(lower::AbstractConverter &converter,
     }
   }
 
-  mlir::ModuleOp module = builder.getModule();
-  mlir::omp::AtomicControlAttr atomicControlAttr =
-      mlir::omp::AtomicControlAttr::get(
-          builder.getContext(), fir::getAtomicIgnoreDenormalMode(module),
-          fir::getAtomicFineGrainedMemory(module),
-          fir::getAtomicRemoteMemory(module));
   builder.restoreInsertionPoint(atomicAt);
   auto updateOp = mlir::omp::AtomicUpdateOp::create(
-      builder, loc, atomAddr, atomicControlAttr, hint,
-      makeMemOrderAttr(converter, memOrder));
+      builder, loc, atomAddr, hint, makeMemOrderAttr(converter, memOrder));
 
   mlir::Region &region = updateOp->getRegion(0);
   mlir::Block *block = builder.createBlock(&region, {}, {atomType}, {loc});
diff --git a/flang/lib/Optimizer/Dialect/Support/FIRContext.cpp b/flang/lib/Optimizer/Dialect/Support/FIRContext.cpp
index c2e0afe122b4e..01c0be66d1ecc 100644
--- a/flang/lib/Optimizer/Dialect/Support/FIRContext.cpp
+++ b/flang/lib/Optimizer/Dialect/Support/FIRContext.cpp
@@ -88,57 +88,6 @@ void fir::setTuneCPU(mlir::ModuleOp mod, llvm::StringRef cpu) {
   mod->setAttr(tuneCpuName, mlir::StringAttr::get(ctx, cpu));
 }
 
-static constexpr const char *atomicIgnoreDenormalModeName =
-    "fir.atomic_ignore_denormal_mode";
-
-void fir::setAtomicIgnoreDenormalMode(mlir::ModuleOp mod, bool value) {
-  if (value) {
-    auto *ctx = mod.getContext();
-    mod->setAttr(atomicIgnoreDenormalModeName, mlir::UnitAttr::get(ctx));
-  } else {
-    if (mod->hasAttr(atomicIgnoreDenormalModeName))
-      mod->removeAttr(atomicIgnoreDenormalModeName);
-  }
-}
-
-bool fir::getAtomicIgnoreDenormalMode(mlir::ModuleOp mod) {
-  return mod->hasAttr(atomicIgnoreDenormalModeName);
-}
-
-static constexpr const char *atomicFineGrainedMemoryName =
-    "fir.atomic_fine_grained_memory";
-
-void fir::setAtomicFineGrainedMemory(mlir::ModuleOp mod, bool value) {
-  if (value) {
-    auto *ctx = mod.getContext();
-    mod->setAttr(atomicFineGrainedMemoryName, mlir::UnitAttr::get(ctx));
-  } else {
-    if (mod->hasAttr(atomicFineGrainedMemoryName))
-      mod->removeAttr(atomicFineGrainedMemoryName);
-  }
-}
-
-bool fir::getAtomicFineGrainedMemory(mlir::ModuleOp mod) {
-  return mod->hasAttr(atomicFineGrainedMemoryName);
-}
-
-static constexpr const char *atomicRemoteMemoryName =
-    "fir.atomic_remote_memory";
-
-void fir::setAtomicRemoteMemory(mlir::ModuleOp mod, bool value) {
-  if (value) {
-    auto *ctx = mod.getContext();
-    mod->setAttr(atomicRemoteMemoryName, mlir::UnitAttr::get(ctx));
-  } else {
-    if (mod->hasAttr(atomicRemoteMemoryName))
-      mod->removeAttr(atomicRemoteMemoryName);
-  }
-}
-
-bool fir::getAtomicRemoteMemory(mlir::ModuleOp mod) {
-  return mod->hasAttr(atomicRemoteMemoryName);
-}
-
 llvm::StringRef fir::getTuneCPU(mlir::ModuleOp mod) {
   if (auto attr = mod->getAttrOfType<mlir::StringAttr>(tuneCpuName))
     return attr.getValue();
diff --git a/flang/test/Lower/OpenMP/atomic-control-options.f90 b/flang/test/Lower/OpenMP/atomic-control-options.f90
deleted file mode 100644
index 8f86a151b3713..0000000000000
--- a/flang/test/Lower/OpenMP/atomic-control-options.f90
+++ /dev/null
@@ -1,37 +0,0 @@
-! RUN: %flang_fc1 -emit-hlfir -triple amdgcn-amd-amdhsa -fopenmp -fopenmp-is-device -munsafe-fp-atomics %s -o - | FileCheck -check-prefix=UNSAFE-FP-ATOMICS %s
-! RUN: %flang_fc1 -emit-hlfir -triple amdgcn-amd-amdhsa -fopenmp -fopenmp-is-device -fatomic-ignore-denormal-mode %s -o - | FileCheck -check-prefix=IGNORE-DENORMAL %s
-! RUN: %flang_fc1 -emit-hlfir -triple amdgcn-amd-amdhsa -fopenmp -fopenmp-is-device -fatomic-fine-grained-memory %s -o - | FileCheck -check-prefix=FINE-GRAINED-MEMORY %s
-! RUN: %flang_fc1 -emit-hlfir -triple amdgcn-amd-amdhsa -fopenmp -fopenmp-is-device -fatomic-remote-memory %s -o - | FileCheck -check-prefix=REMOTE-MEMORY %s
-program test
-    implicit none
-    integer :: A, B, threads
-    threads = 128
-    A = 0
-    B = 0
-    !UNSAFE-FP-ATOMICS: omp.atomic.update %{{.*}} : !fir.ref<i32> {
-    !UNSAFE-FP-ATOMICS: } {atomic_control = #omp.atomic_control<ignore_denormal_mode = true>}
-    !IGNORE-DENORMAL: omp.atomic.update %{{.*}} : !fir.ref<i32> {
-    !IGNORE-DENORMAL: } {atomic_control = #omp.atomic_control<ignore_denormal_mode = true>}
-    !FINE-GRAINED-MEMORY: omp.atomic.update %{{.*}} : !fir.ref<i32> {
-    !FINE-GRAINED-MEMORY: } {atomic_control = #omp.atomic_control<fine_grained_memory = true>}
-    !REMOTE-MEMORY: omp.atomic.update %{{.*}} : !fir.ref<i32> {
-    !REMOTE-MEMORY: } {atomic_control = #omp.atomic_control<remote_memory = true>}
-    !$omp target parallel num_threads(threads)
-    !$omp atomic
-    A =  A + 1
-    !$omp end target parallel
-    !UNSAFE-FP-ATOMICS: omp.atomic.update %{{.*}} : !fir.ref<i32> {
-    !UNSAFE-FP-ATOMICS: } {atomic_control = #omp.atomic_control<ignore_denormal_mode = true>}
-    !IGNORE-DENORMAL: omp.atomic.update %{{.*}} : !fir.ref<i32> {
-    !IGNORE-DENORMAL: } {atomic_control = #omp.atomic_control<ignore_denormal_mode = true>}
-    !FINE-GRAINED-MEMORY: omp.atomic.update %{{.*}} : !fir.ref<i32> {
-    !FINE-GRAINED-MEMORY: } {atomic_control = #omp.atomic_control<fine_grained_memory = true>}
-    !REMOTE-MEMORY: omp.atomic.update %{{.*}} : !fir.ref<i32> {
-    !REMOTE-MEMORY: } {atomic_control = #omp.atomic_control<remote_memory = true>}
-    !$omp target parallel num_threads(threads)
-    !$omp atomic capture
-        A = A + B
-        B = A
-    !$omp end atomic
-    !$omp end target parallel
-end program test
diff --git a/mlir/include/mlir/Dialect/OpenMP/OpenMPAttrDefs.td b/mlir/include/mlir/Dialect/OpenMP/OpenMPAttrDefs.td
index 72ce4c6a21cb3..704d0b2220e8a 100644
--- a/mlir/include/mlir/Dialect/OpenMP/OpenMPAttrDefs.td
+++ b/mlir/include/mlir/Dialect/OpenMP/OpenMPAttrDefs.td
@@ -22,21 +22,6 @@ class OpenMP_Attr<string name, string attrMnemonic, list<Trait> traits = [],
   let mnemonic = attrMnemonic;
 }
 
-//===----------------------------------------------------------------------===//
-// AtomicControlAttr
-//===----------------------------------------------------------------------===//
-
-// Atomic control attributes hold information about architectural
-// characteristics which are required for lowering atomic operations.
-def AtomicControlAttr : OpenMP_Attr<"AtomicControl", "atomic_control"> {
-  let parameters =
-      (ins DefaultValuedParameter<"bool", "false">:$ignore_denormal_mode,
-          DefaultValuedParameter<"bool", "false">:$fine_grained_memory,
-          DefaultValuedParameter<"bool", "false">:$remote_memory);
-
-  let assemblyFormat = "`<` struct(params) `>`";
-}
-
 //===----------------------------------------------------------------------===//
 // DeclareTargetAttr
 //===----------------------------------------------------------------------===//
diff --git a/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td b/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td
index be114ea4fb631..8cf18b43450ab 100644
--- a/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td
+++ b/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td
@@ -1750,11 +1750,9 @@ def AtomicUpdateOp : OpenMP_Op<"atomic.update", traits = [
     operations.
   }] # clausesDescription;
 
-  let arguments = !con(
-      (ins Arg<OpenMP_PointerLikeType,
-               "Address of variable to be updated", [MemRead, MemWrite]>:$x,
-          OptionalAttr<AtomicControlAttr>:$atomic_control),
-      clausesArgs);
+  let arguments = !con((ins Arg<OpenMP_PointerLikeType,
+                                "Address of variable to be updated",
+                                [MemRead, MemWrite]>:$x), clausesArgs);
 
   // Override region definition.
   let regions = (region SizedRegion<1>:$region);
diff --git a/mlir/test/Dialect/OpenMP/ops.mlir b/mlir/test/Dialect/OpenMP/ops.mlir
index 8c846cde1a3ca..4c50ed3230976 100644
--- a/mlir/test/Dialect/OpenMP/ops.mlir
+++ b/mlir/test/Dialect/OpenMP/ops.mlir
@@ -1406,7 +1406,7 @@ func.func @omp_atomic_update(%x : memref<i32>, %expr : i32, %xBool : memref<i1>,
   // CHECK-NEXT: (%[[XVAL:.*]]: i1):
   // CHECK-NEXT:   %[[NEWVAL:.*]] = llvm.icmp "eq" %[[XVAL]], %[[EXPRBOOL]] : i1
   // CHECK-NEXT:   omp.yield(%[[NEWVAL]] : i1)
-  // CHECK-NEXT: }
+  // }
   omp.atomic.update %xBool : memref<i1> {
   ^bb0(%xval: i1):
     %newval = llvm.icmp "eq" %xval, %exprBool : i1
@@ -1562,14 +1562,6 @@ func.func @omp_atomic_update(%x : memref<i32>, %expr : i32, %xBool : memref<i1>,
     omp.yield(%newval : i32)
   }
 
-  // CHECK: omp.atomic.update %[[X]] : memref<i32> {
-  // CHECK-NEXT: (%[[XVAL:.*]]: i32):
-  // CHECK-NEXT:   omp.yield(%{{.+}} : i32)
-  // CHECK-NEXT: } {atomic_control = #omp.atomic_control<ignore_denormal_mode = true, fine_grained_memory = true, remote_memory = true>}
-  omp.atomic.update %x : memref<i32> {
-  ^bb0(%xval:i32):
-    omp.yield(%const:i32)
-  } {atomic_control = #omp.atomic_control<ignore_denormal_mode = true, fine_grained_memory = true, remote_memory = true>}
   return
 }
 

@klausler
Copy link
Contributor

Reversion might be overkill. Maybe the test can just be disabled with an !XFAIL: * or similar until the author can fix it up.

@anchuraj
Copy link
Contributor

Thank you for the revert. I was away and couldn't revert it. Will take a look when I am back.

@kiranchandramohan kiranchandramohan merged commit efe1aa8 into main Jul 24, 2025
9 checks passed
@kiranchandramohan kiranchandramohan deleted the revert-143441-atomic-control-frontend branch July 24, 2025 20:54
@skatrak
Copy link
Member

skatrak commented Jul 25, 2025

I imagine we could fix the problem by removing the -triple amdgcn-amd-amdgpu option from the RUN lines of the new failing test, or by adding a !REQUIRES: amdgpu-registered-target if the option is needed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
clang Clang issues not falling into any other category flang:driver flang:fir-hlfir flang:openmp flang Flang issues not falling into any other category mlir:openmp mlir
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants