[Mlir-commits] [mlir] 50639d3 - [OpenMP][MLIR] Add lowering of omp::FlagsAttr to LLVM-IR
Andrew Gozillon
llvmlistbot at llvm.org
Wed Apr 19 06:31:38 PDT 2023
Author: Andrew Gozillon
Date: 2023-04-19T08:31:26-05:00
New Revision: 50639d3d0dfcc62405a04763a7603021408cfa84
URL: https://github.com/llvm/llvm-project/commit/50639d3d0dfcc62405a04763a7603021408cfa84
DIFF: https://github.com/llvm/llvm-project/commit/50639d3d0dfcc62405a04763a7603021408cfa84.diff
LOG: [OpenMP][MLIR] Add lowering of omp::FlagsAttr to LLVM-IR
The omp::FlagsAttr contains OpenMP RTL flags
given by a user to the compiler and a frontend
(flang currently) then populates the omp::FlagsAttr
which will then lower these to LLVM globals
which are utilised by the OpenMP runtime.
Reviewers: jdoerfert
Differential Revision: https://reviews.llvm.org/D147344
Added:
Modified:
mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
mlir/test/Target/LLVMIR/openmp-llvm.mlir
Removed:
################################################################################
diff --git a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
index 51754933fe790..4d9c54100a2cb 100644
--- a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
@@ -1542,6 +1542,38 @@ convertOmpTargetData(Operation *op, llvm::IRBuilderBase &builder,
return bodyGenStatus;
}
+/// Lowers the FlagsAttr which is applied to the module on the device
+/// pass when offloading, this attribute contains OpenMP RTL globals that can
+/// be passed as flags to the frontend, otherwise they are set to default
+LogicalResult convertFlagsAttr(Operation *op, mlir::omp::FlagsAttr attribute,
+ LLVM::ModuleTranslation &moduleTranslation) {
+ llvm::OpenMPIRBuilder *ompBuilder = moduleTranslation.getOpenMPBuilder();
+
+ 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");
+
+ return success();
+}
+
namespace {
/// Implementation of the dialect interface that converts operations belonging
@@ -1556,10 +1588,33 @@ class OpenMPDialectLLVMIRTranslationInterface
LogicalResult
convertOperation(Operation *op, llvm::IRBuilderBase &builder,
LLVM::ModuleTranslation &moduleTranslation) const final;
+
+ LogicalResult
+ amendOperation(Operation *op, NamedAttribute attribute,
+ LLVM::ModuleTranslation &moduleTranslation) const final;
};
} // namespace
+/// Given an OpenMP MLIR attribute, create the corresponding LLVM-IR, runtime
+/// calls, or operation amendments
+LogicalResult OpenMPDialectLLVMIRTranslationInterface::amendOperation(
+ Operation *op, NamedAttribute attribute,
+ LLVM::ModuleTranslation &moduleTranslation) const {
+
+ return llvm::TypeSwitch<Attribute, LogicalResult>(attribute.getValue())
+ .Case([&](mlir::omp::FlagsAttr rtlAttr) {
+ return convertFlagsAttr(op, rtlAttr, moduleTranslation);
+ })
+ .Default([&](Attribute attr) {
+ // fall through for omp attributes that do not require lowering and/or
+ // have no concrete definition and thus no type to define a case on
+ return success();
+ });
+
+ return failure();
+}
+
/// Given an OpenMP MLIR operation, create the corresponding LLVM IR
/// (including OpenMP runtime calls).
LogicalResult OpenMPDialectLLVMIRTranslationInterface::convertOperation(
diff --git a/mlir/test/Target/LLVMIR/openmp-llvm.mlir b/mlir/test/Target/LLVMIR/openmp-llvm.mlir
index f9bf47f388af0..4be992376eb76 100644
--- a/mlir/test/Target/LLVMIR/openmp-llvm.mlir
+++ b/mlir/test/Target/LLVMIR/openmp-llvm.mlir
@@ -2454,3 +2454,86 @@ llvm.func @omp_opaque_pointers(%arg0 : !llvm.ptr, %arg1: !llvm.ptr, %expr: i32)
}
llvm.return
}
+
+// -----
+
+// CHECK-NOT: @__omp_rtl_debug_kind = weak_odr hidden constant i32 1
+// CHECK-NOT: @__omp_rtl_assume_teams_oversubscription = weak_odr hidden constant i32 1
+// CHECK-NOT: @__omp_rtl_assume_threads_oversubscription = weak_odr hidden constant i32 1
+// CHECK-NOT: @__omp_rtl_assume_no_thread_state = weak_odr hidden constant i32 1
+// CHECK-NOT: @__omp_rtl_assume_no_nested_parallelism = weak_odr hidden constant i32 1
+module attributes {omp.flags = #omp.flags<debug_kind = 1, assume_teams_oversubscription = true,
+ assume_threads_oversubscription = true, assume_no_thread_state = true,
+ assume_no_nested_parallelism = true>} {}
+
+// -----
+
+// CHECK: @__omp_rtl_debug_kind = weak_odr hidden constant i32 1
+// CHECK: @__omp_rtl_assume_teams_oversubscription = weak_odr hidden constant i32 1
+// CHECK: @__omp_rtl_assume_threads_oversubscription = weak_odr hidden constant i32 1
+// CHECK: @__omp_rtl_assume_no_thread_state = weak_odr hidden constant i32 1
+// CHECK: @__omp_rtl_assume_no_nested_parallelism = weak_odr hidden constant i32 1
+module attributes {omp.flags = #omp.flags<debug_kind = 1, assume_teams_oversubscription = true,
+ assume_threads_oversubscription = true, assume_no_thread_state = true,
+ assume_no_nested_parallelism = true>,
+ omp.is_device = #omp.isdevice<is_device = true>} {}
+
+// -----
+
+// CHECK-NOT: @__omp_rtl_debug_kind = weak_odr hidden constant i32 0
+// CHECK-NOT: @__omp_rtl_assume_teams_oversubscription = weak_odr hidden constant i32 0
+// CHECK-NOT: @__omp_rtl_assume_threads_oversubscription = weak_odr hidden constant i32 0
+// CHECK-NOT: @__omp_rtl_assume_no_thread_state = weak_odr hidden constant i32 0
+// CHECK-NOT: @__omp_rtl_assume_no_nested_parallelism = weak_odr hidden constant i32 0
+module attributes {omp.flags = #omp.flags<>} {}
+
+// -----
+
+// CHECK: @__omp_rtl_debug_kind = weak_odr hidden constant i32 0
+// CHECK: @__omp_rtl_assume_teams_oversubscription = weak_odr hidden constant i32 0
+// CHECK: @__omp_rtl_assume_threads_oversubscription = weak_odr hidden constant i32 0
+// CHECK: @__omp_rtl_assume_no_thread_state = weak_odr hidden constant i32 0
+// CHECK: @__omp_rtl_assume_no_nested_parallelism = weak_odr hidden constant i32 0
+module attributes {omp.flags = #omp.flags<>, omp.is_device = #omp.isdevice<is_device = true>} {}
+
+// -----
+
+// CHECK-NOT: @__omp_rtl_debug_kind = weak_odr hidden constant i32 0
+// CHECK-NOT: @__omp_rtl_assume_teams_oversubscription = weak_odr hidden constant i32 0
+// CHECK-NOT: @__omp_rtl_assume_threads_oversubscription = weak_odr hidden constant i32 0
+// CHECK-NOT: @__omp_rtl_assume_no_thread_state = weak_odr hidden constant i32 0
+// CHECK-NOT: @__omp_rtl_assume_no_nested_parallelism = weak_odr hidden constant i32 0
+module attributes {omp.flags = #omp.flags<debug_kind = 0, assume_teams_oversubscription = false,
+ assume_threads_oversubscription = false, assume_no_thread_state = false,
+ assume_no_nested_parallelism = false>} {}
+
+// -----
+
+// CHECK: @__omp_rtl_debug_kind = weak_odr hidden constant i32 0
+// CHECK: @__omp_rtl_assume_teams_oversubscription = weak_odr hidden constant i32 0
+// CHECK: @__omp_rtl_assume_threads_oversubscription = weak_odr hidden constant i32 0
+// CHECK: @__omp_rtl_assume_no_thread_state = weak_odr hidden constant i32 0
+// CHECK: @__omp_rtl_assume_no_nested_parallelism = weak_odr hidden constant i32 0
+module attributes {omp.flags = #omp.flags<debug_kind = 0, assume_teams_oversubscription = false,
+ assume_threads_oversubscription = false, assume_no_thread_state = false,
+ assume_no_nested_parallelism = false>,
+ omp.is_device = #omp.isdevice<is_device = true>} {}
+
+// -----
+
+// CHECK-NOT: @__omp_rtl_debug_kind = weak_odr hidden constant i32 0
+// CHECK-NOT: @__omp_rtl_assume_teams_oversubscription = weak_odr hidden constant i32 1
+// CHECK-NOT: @__omp_rtl_assume_threads_oversubscription = weak_odr hidden constant i32 0
+// CHECK-NOT: @__omp_rtl_assume_no_thread_state = weak_odr hidden constant i32 1
+// CHECK-NOT: @__omp_rtl_assume_no_nested_parallelism = weak_odr hidden constant i32 0
+module attributes {omp.flags = #omp.flags<assume_teams_oversubscription = true, assume_no_thread_state = true>} {}
+
+// -----
+
+// CHECK: @__omp_rtl_debug_kind = weak_odr hidden constant i32 0
+// CHECK: @__omp_rtl_assume_teams_oversubscription = weak_odr hidden constant i32 1
+// CHECK: @__omp_rtl_assume_threads_oversubscription = weak_odr hidden constant i32 0
+// CHECK: @__omp_rtl_assume_no_thread_state = weak_odr hidden constant i32 1
+// CHECK: @__omp_rtl_assume_no_nested_parallelism = weak_odr hidden constant i32 0
+module attributes {omp.flags = #omp.flags<assume_teams_oversubscription = true, assume_no_thread_state = true>,
+ omp.is_device = #omp.isdevice<is_device = true>} {}
More information about the Mlir-commits
mailing list