https://github.com/skatrak updated https://github.com/llvm/llvm-project/pull/213648
>From d9fb1b3dfe5aa430c9877047b563f5cf7abcba68 Mon Sep 17 00:00:00 2001 From: Sergio Afonso <[email protected]> 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 fa1bdd267fc8f..6c4e6d18a6c8c 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 e76808394becd..cfb3d20be6955 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 d15ea19b9065c..a6854752f75b6 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 e09bb720ced2d..2c81c9231a9b7 100644 --- a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp @@ -8184,27 +8184,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(); } _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
