[flang-commits] [clang] [flang] [mlir] [MLIR][OpenMP] Refactor omp dialect utils headers, NFC (PR #213648)
Sergio Afonso via flang-commits
flang-commits at lists.llvm.org
Mon Aug 3 04:23:48 PDT 2026
https://github.com/skatrak created https://github.com/llvm/llvm-project/pull/213648
This patch implements some non-functional refactoring changes:
- It consolidates the two existing "utils" headers into one.
- It renames fields and arguments to the `OffloadModuleOpts` structure to follow the MLIR style guide and more closely match the corresponding `OffloadModuleInterface` attributes.
- It removes comments in OpenMP-to-LLVMIR translation referring to Flang frontend options associated to the `OffloadModuleInterface`.
>From aade23546739bfe8a5efa43787b01864a3474144 Mon Sep 17 00:00:00 2001
From: Sergio Afonso <Sergio.AfonsoFumero at amd.com>
Date: Tue, 21 Jul 2026 14:11:39 +0100
Subject: [PATCH] [MLIR][OpenMP] Refactor omp dialect utils headers, NFC
This patch implements some non-functional refactoring changes:
- It consolidates the two existing "utils" headers into one.
- It renames fields and arguments to the `OffloadModuleOpts` structure
to follow the MLIR style guide and more closely match the
corresponding `OffloadModuleInterface` attributes.
- It removes comments in OpenMP-to-LLVMIR translation referring to Flang
frontend options associated to the `OffloadModuleInterface`.
---
clang/lib/CIR/CodeGen/CIRGenModule.cpp | 2 +-
clang/tools/cir-translate/cir-translate.cpp | 2 +-
flang/tools/bbc/bbc.cpp | 3 +-
.../mlir/Dialect/OpenMP/OpenMPDialect.h | 2 +-
.../include/mlir/Dialect/OpenMP/OpenMPUtils.h | 109 ------------------
.../include/mlir/Dialect/OpenMP/Utils/Utils.h | 54 +++++++++
mlir/lib/Dialect/OpenMP/Utils/Utils.cpp | 40 +++++++
.../OpenMP/OpenMPToLLVMIRTranslation.cpp | 31 ++---
8 files changed, 109 insertions(+), 134 deletions(-)
delete mode 100644 mlir/include/mlir/Dialect/OpenMP/OpenMPUtils.h
diff --git a/clang/lib/CIR/CodeGen/CIRGenModule.cpp b/clang/lib/CIR/CodeGen/CIRGenModule.cpp
index a7143408c9bee..6c0bf2d5b61eb 100644
--- a/clang/lib/CIR/CodeGen/CIRGenModule.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenModule.cpp
@@ -16,7 +16,7 @@
#include "CIRGenConstantEmitter.h"
#include "CIRGenFunction.h"
-#include "mlir/Dialect/OpenMP/OpenMPUtils.h"
+#include "mlir/Dialect/OpenMP/Utils/Utils.h"
#include "mlir/IR/SymbolTable.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/ASTLambda.h"
diff --git a/clang/tools/cir-translate/cir-translate.cpp b/clang/tools/cir-translate/cir-translate.cpp
index f99d89d9b0be4..4452741d7433e 100644
--- a/clang/tools/cir-translate/cir-translate.cpp
+++ b/clang/tools/cir-translate/cir-translate.cpp
@@ -14,7 +14,7 @@
#include "mlir/Dialect/Func/IR/FuncOps.h"
#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
#include "mlir/Dialect/OpenMP/OpenMPDialect.h"
-#include "mlir/Dialect/OpenMP/OpenMPUtils.h"
+#include "mlir/Dialect/OpenMP/Utils/Utils.h"
#include "mlir/IR/BuiltinOps.h"
#include "mlir/IR/MLIRContext.h"
#include "mlir/InitAllTranslations.h"
diff --git a/flang/tools/bbc/bbc.cpp b/flang/tools/bbc/bbc.cpp
index e1017a0005b50..57fd47dea1a34 100644
--- a/flang/tools/bbc/bbc.cpp
+++ b/flang/tools/bbc/bbc.cpp
@@ -536,7 +536,8 @@ static llvm::LogicalResult convertFortranSourceToMLIR(
setOpenMPTargetDebug, setOpenMPTeamSubscription,
setOpenMPThreadSubscription, setOpenMPNoThreadState,
setOpenMPNoNestedParallelism, enableOpenMPDevice, enableOpenMPGPU,
- enableOpenMPForceUSM, setOpenMPVersion, "", targetTriples, setNoGPULib);
+ enableOpenMPForceUSM, setOpenMPVersion, /*hostIRFile=*/"",
+ targetTriples, setNoGPULib);
mlir::omp::setOffloadModuleInterfaceAttributes(mlirModule,
offloadModuleOpts);
mlir::omp::setOpenMPVersionAttribute(mlirModule, setOpenMPVersion);
diff --git a/mlir/include/mlir/Dialect/OpenMP/OpenMPDialect.h b/mlir/include/mlir/Dialect/OpenMP/OpenMPDialect.h
index 2507a5a36b514..12606f299bf0a 100644
--- a/mlir/include/mlir/Dialect/OpenMP/OpenMPDialect.h
+++ b/mlir/include/mlir/Dialect/OpenMP/OpenMPDialect.h
@@ -17,7 +17,7 @@
#include "mlir/Dialect/OpenACCMPCommon/Interfaces/AtomicInterfaces.h"
#include "mlir/Dialect/OpenACCMPCommon/Interfaces/OpenACCMPOpsInterfaces.h"
#include "mlir/Dialect/OpenMP/OpenMPInterfaces.h"
-#include "mlir/Dialect/OpenMP/OpenMPUtils.h"
+#include "mlir/Dialect/OpenMP/Utils/Utils.h"
#include "mlir/IR/Dialect.h"
#include "mlir/IR/OpDefinition.h"
#include "mlir/IR/PatternMatch.h"
diff --git a/mlir/include/mlir/Dialect/OpenMP/OpenMPUtils.h b/mlir/include/mlir/Dialect/OpenMP/OpenMPUtils.h
deleted file mode 100644
index 002377ae6d24a..0000000000000
--- a/mlir/include/mlir/Dialect/OpenMP/OpenMPUtils.h
+++ /dev/null
@@ -1,109 +0,0 @@
-//===- OpenMPUtils.h - OpenMP utilities -------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-/// \file
-/// Shared utilities for setting OpenMP offload module interface attributes.
-/// These are used by both Flang and Clang (CIR) frontends.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef MLIR_DIALECT_OPENMP_OPENMPUTILS_H_
-#define MLIR_DIALECT_OPENMP_OPENMPUTILS_H_
-
-#include "mlir/Dialect/OpenMP/OpenMPInterfaces.h"
-#include "mlir/Dialect/OpenMP/OpenMPOpsAttributes.h"
-#include "mlir/IR/BuiltinOps.h"
-#include "llvm/ADT/SmallVector.h"
-#include "llvm/TargetParser/Triple.h"
-#include <cstdint>
-#include <string>
-#include <vector>
-
-namespace mlir::omp {
-
-struct OffloadModuleOpts {
- OffloadModuleOpts() = default;
- OffloadModuleOpts(uint32_t openMPTargetDebug, bool openMPTeamSubscription,
- bool openMPThreadSubscription, bool openMPNoThreadState,
- bool openMPNoNestedParallelism, bool openMPIsTargetDevice,
- bool openMPIsGPU, bool openMPForceUSM,
- uint32_t openMPVersion, std::string ompHostIRFile = {},
- const std::vector<llvm::Triple> &ompTargetTriples = {},
- bool noGPULib = false)
- : OpenMPTargetDebug(openMPTargetDebug),
- OpenMPTeamSubscription(openMPTeamSubscription),
- OpenMPThreadSubscription(openMPThreadSubscription),
- OpenMPNoThreadState(openMPNoThreadState),
- OpenMPNoNestedParallelism(openMPNoNestedParallelism),
- OpenMPIsTargetDevice(openMPIsTargetDevice), OpenMPIsGPU(openMPIsGPU),
- OpenMPForceUSM(openMPForceUSM), OpenMPVersion(openMPVersion),
- OMPHostIRFile(std::move(ompHostIRFile)),
- OMPTargetTriples(ompTargetTriples.begin(), ompTargetTriples.end()),
- NoGPULib(noGPULib) {}
-
- uint32_t OpenMPTargetDebug = 0;
- bool OpenMPTeamSubscription = false;
- bool OpenMPThreadSubscription = false;
- bool OpenMPNoThreadState = false;
- bool OpenMPNoNestedParallelism = false;
- bool OpenMPIsTargetDevice = false;
- bool OpenMPIsGPU = false;
- bool OpenMPForceUSM = false;
- uint32_t OpenMPVersion = 31;
- std::string OMPHostIRFile = {};
- std::vector<llvm::Triple> OMPTargetTriples = {};
- bool NoGPULib = false;
-};
-
-/// Sets OpenMP offload module interface attributes on a ModuleOp, shared
-/// between Flang and Clang (CIR) frontends.
-[[maybe_unused]] static void
-setOffloadModuleInterfaceAttributes(ModuleOp module, OffloadModuleOpts opts) {
- if (auto offloadMod =
- llvm::dyn_cast<OffloadModuleInterface>(module.getOperation())) {
- offloadMod.setIsTargetDevice(opts.OpenMPIsTargetDevice);
- offloadMod.setIsGPU(opts.OpenMPIsGPU);
- if (opts.OpenMPForceUSM)
- offloadMod.setRequires(ClauseRequires::unified_shared_memory);
- offloadMod.setFlags(opts.OpenMPTargetDebug, opts.OpenMPTeamSubscription,
- opts.OpenMPThreadSubscription, opts.OpenMPNoThreadState,
- opts.OpenMPNoNestedParallelism, opts.OpenMPVersion,
- opts.NoGPULib);
- if (opts.OpenMPIsTargetDevice && !opts.OMPHostIRFile.empty())
- offloadMod.setHostIRFilePath(opts.OMPHostIRFile);
-
- auto strTriples = llvm::to_vector(
- llvm::map_range(opts.OMPTargetTriples, [](llvm::Triple triple) {
- return triple.normalize();
- }));
- offloadMod.setTargetTriples(strTriples);
- }
-}
-
-[[maybe_unused]] static void setOpenMPVersionAttribute(ModuleOp module,
- int64_t version) {
- module.getOperation()->setAttr(
- StringAttr::get(module.getContext(), llvm::Twine{"omp.version"}),
- VersionAttr::get(module.getContext(), version));
-}
-
-[[maybe_unused]] static int64_t
-getOpenMPVersionAttribute(ModuleOp module, int64_t fallback = -1) {
- if (Attribute verAttr = module->getAttr("omp.version"))
- return llvm::cast<VersionAttr>(verAttr).getVersion();
- return fallback;
-}
-
-/// Returns true if the given module contains OpenMP code.
-[[maybe_unused]] static bool isOpenMPModule(ModuleOp module) {
- return module->hasAttr("omp.version");
-}
-
-} // namespace mlir::omp
-
-#endif // MLIR_DIALECT_OPENMP_OPENMPUTILS_H_
diff --git a/mlir/include/mlir/Dialect/OpenMP/Utils/Utils.h b/mlir/include/mlir/Dialect/OpenMP/Utils/Utils.h
index ce625c7170efe..16b6970441ef6 100644
--- a/mlir/include/mlir/Dialect/OpenMP/Utils/Utils.h
+++ b/mlir/include/mlir/Dialect/OpenMP/Utils/Utils.h
@@ -13,12 +13,66 @@
#ifndef MLIR_DIALECT_OPENMP_UTILS_UTILS_H_
#define MLIR_DIALECT_OPENMP_UTILS_UTILS_H_
+#include "mlir/IR/BuiltinOps.h"
#include "mlir/IR/Operation.h"
#include "mlir/IR/Value.h"
+#include "llvm/TargetParser/Triple.h"
+#include <cstdint>
+#include <string>
+#include <vector>
namespace mlir {
namespace omp {
+/// Offload-specific OpenMP module attributes, associated to the
+/// OffloadModuleInterface.
+struct OffloadModuleOpts {
+ OffloadModuleOpts() = default;
+ OffloadModuleOpts(uint32_t targetDebugKind, bool assumeTeamsOversubscription,
+ bool assumeThreadsOversubscription,
+ bool assumeNoThreadState, bool assumeNoNestedParallelism,
+ bool isTargetDevice, bool isGPU, bool forceUSM,
+ uint32_t openMPDeviceVersion, const Twine &hostIRFile,
+ ArrayRef<llvm::Triple> targetTriples = {},
+ bool noGPULib = false)
+ : targetDebugKind(targetDebugKind),
+ assumeTeamsOversubscription(assumeTeamsOversubscription),
+ assumeThreadsOversubscription(assumeThreadsOversubscription),
+ assumeNoThreadState(assumeNoThreadState),
+ assumeNoNestedParallelism(assumeNoNestedParallelism),
+ isTargetDevice(isTargetDevice), isGPU(isGPU), forceUSM(forceUSM),
+ openMPDeviceVersion(openMPDeviceVersion), hostIRFile(hostIRFile.str()),
+ targetTriples(targetTriples.begin(), targetTriples.end()),
+ noGPULib(noGPULib) {}
+
+ uint32_t targetDebugKind = 0;
+ bool assumeTeamsOversubscription = false;
+ bool assumeThreadsOversubscription = false;
+ bool assumeNoThreadState = false;
+ bool assumeNoNestedParallelism = false;
+ bool isTargetDevice = false;
+ bool isGPU = false;
+ bool forceUSM = false;
+ uint32_t openMPDeviceVersion = 31;
+ std::string hostIRFile = {};
+ std::vector<llvm::Triple> targetTriples = {};
+ bool noGPULib = false;
+};
+
+/// Sets OpenMP offload module interface attributes on a ModuleOp, shared
+/// between Flang and Clang (CIR) frontends.
+void setOffloadModuleInterfaceAttributes(ModuleOp module,
+ const OffloadModuleOpts &opts);
+
+/// Adds or updates the omp.version attribute.
+void setOpenMPVersionAttribute(ModuleOp module, int64_t version);
+
+/// Returns the value of the omp.version attribute, if present, or the fallback.
+int64_t getOpenMPVersionAttribute(ModuleOp module, int64_t fallback = -1);
+
+/// Checks whether this is an OpenMP-enabled module.
+bool isOpenMPModule(ModuleOp module);
+
/// Check whether the value representing an allocation, assumed to have been
/// defined in a shared device context, is used in a manner that would require
/// device shared memory for correctness.
diff --git a/mlir/lib/Dialect/OpenMP/Utils/Utils.cpp b/mlir/lib/Dialect/OpenMP/Utils/Utils.cpp
index 84fa6703263f2..dca02584e32c6 100644
--- a/mlir/lib/Dialect/OpenMP/Utils/Utils.cpp
+++ b/mlir/lib/Dialect/OpenMP/Utils/Utils.cpp
@@ -17,6 +17,46 @@
using namespace mlir;
+void mlir::omp::setOffloadModuleInterfaceAttributes(
+ ModuleOp module, const OffloadModuleOpts &opts) {
+ if (auto offloadMod = llvm::dyn_cast<OffloadModuleInterface>(*module)) {
+ offloadMod.setIsTargetDevice(opts.isTargetDevice);
+ offloadMod.setIsGPU(opts.isGPU);
+ if (opts.forceUSM)
+ offloadMod.setRequires(ClauseRequires::unified_shared_memory);
+ offloadMod.setFlags(opts.targetDebugKind, opts.assumeTeamsOversubscription,
+ opts.assumeThreadsOversubscription,
+ opts.assumeNoThreadState,
+ opts.assumeNoNestedParallelism,
+ opts.openMPDeviceVersion, opts.noGPULib);
+ if (opts.isTargetDevice && !opts.hostIRFile.empty())
+ offloadMod.setHostIRFilePath(opts.hostIRFile);
+
+ auto strTriples = llvm::to_vector(
+ llvm::map_range(opts.targetTriples, [](const llvm::Triple &triple) {
+ return triple.normalize();
+ }));
+ offloadMod.setTargetTriples(strTriples);
+ }
+}
+
+void mlir::omp::setOpenMPVersionAttribute(ModuleOp module, int64_t version) {
+ module->setAttr(
+ StringAttr::get(module.getContext(), llvm::Twine{"omp.version"}),
+ VersionAttr::get(module.getContext(), version));
+}
+
+int64_t mlir::omp::getOpenMPVersionAttribute(ModuleOp module,
+ int64_t fallback) {
+ if (Attribute verAttr = module->getAttr("omp.version"))
+ return llvm::cast<VersionAttr>(verAttr).getVersion();
+ return fallback;
+}
+
+bool mlir::omp::isOpenMPModule(ModuleOp module) {
+ return module->hasAttr("omp.version");
+}
+
static bool allocaUseRequiresSharedMem(const OpOperand &use) {
Operation *owner = use.getOwner();
if (auto parallelOp = dyn_cast<omp::ParallelOp>(owner)) {
diff --git a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
index 1c50ff192c3d5..d5b36df8026b9 100644
--- a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
@@ -8065,27 +8065,16 @@ convertFlagsAttr(Operation *op, mlir::omp::FlagsAttr attribute,
if (attribute.getNoGpuLib())
return success();
- ompBuilder->createGlobalFlag(
- attribute.getDebugKind() /*LangOpts().OpenMPTargetDebug*/,
- "__omp_rtl_debug_kind");
- ompBuilder->createGlobalFlag(
- attribute
- .getAssumeTeamsOversubscription() /*LangOpts().OpenMPTeamSubscription*/
- ,
- "__omp_rtl_assume_teams_oversubscription");
- ompBuilder->createGlobalFlag(
- attribute
- .getAssumeThreadsOversubscription() /*LangOpts().OpenMPThreadSubscription*/
- ,
- "__omp_rtl_assume_threads_oversubscription");
- ompBuilder->createGlobalFlag(
- attribute.getAssumeNoThreadState() /*LangOpts().OpenMPNoThreadState*/,
- "__omp_rtl_assume_no_thread_state");
- ompBuilder->createGlobalFlag(
- attribute
- .getAssumeNoNestedParallelism() /*LangOpts().OpenMPNoNestedParallelism*/
- ,
- "__omp_rtl_assume_no_nested_parallelism");
+ ompBuilder->createGlobalFlag(attribute.getDebugKind(),
+ "__omp_rtl_debug_kind");
+ ompBuilder->createGlobalFlag(attribute.getAssumeTeamsOversubscription(),
+ "__omp_rtl_assume_teams_oversubscription");
+ ompBuilder->createGlobalFlag(attribute.getAssumeThreadsOversubscription(),
+ "__omp_rtl_assume_threads_oversubscription");
+ ompBuilder->createGlobalFlag(attribute.getAssumeNoThreadState(),
+ "__omp_rtl_assume_no_thread_state");
+ ompBuilder->createGlobalFlag(attribute.getAssumeNoNestedParallelism(),
+ "__omp_rtl_assume_no_nested_parallelism");
return success();
}
More information about the flang-commits
mailing list