let assemblyFormat = "`<` struct(params) `>`";
}
+//===----------------------------------------------------------------------===//
+// Runtime library flag's attribute that holds information for lowering to LLVM
+//===----------------------------------------------------------------------===//
+
+def FlagsAttr : OpenMP_Attr<"Flags", "flags"> {
+ let parameters = (ins
+ DefaultValuedParameter<"uint32_t", "0">:$debug_kind,
+ DefaultValuedParameter<"bool", "false">:$assume_teams_oversubscription,
+ DefaultValuedParameter<"bool", "false">:$assume_threads_oversubscription,
+ DefaultValuedParameter<"bool", "false">:$assume_no_thread_state,
+ DefaultValuedParameter<"bool", "false">:$assume_no_nested_parallelism
+ );
+
+ let assemblyFormat = "`<` struct(params) `>`";
+}
+
class OpenMP_Op<string mnemonic, list<Trait> traits = []> :
Op<OpenMP_Dialect, mnemonic, traits>;
return isDevice.dyn_cast<IsDeviceAttr>().getIsDevice();
return false;
}]>,
+ InterfaceMethod<
+ /*description=*/[{
+ Get the FlagsAttr attribute on the current module if it exists
+ and return the attribute, if it doesn't exit it returns a nullptr
+ }],
+ /*retTy=*/"mlir::omp::FlagsAttr",
+ /*methodName=*/"getFlags",
+ (ins), [{}], [{
+ if (Attribute flags = $_op->getAttr("omp.flags"))
+ return flags.dyn_cast_or_null<mlir::omp::FlagsAttr>();
+ return nullptr;
+ }]>,
+ InterfaceMethod<
+ /*description=*/[{
+ Apply an omp.FlagsAttr to a module with the specified values
+ for the flags
+ }],
+ /*retTy=*/"void",
+ /*methodName=*/"setFlags",
+ (ins "uint32_t":$debugKind,
+ "bool":$assumeTeamsOversubscription,
+ "bool":$assumeThreadsOversubscription,
+ "bool":$assumeNoThreadState,
+ "bool":$assumeNoNestedParallelism), [{}], [{
+ $_op->setAttr(("omp." + mlir::omp::FlagsAttr::getMnemonic()).str(),
+ mlir::omp::FlagsAttr::get($_op->getContext(), debugKind,
+ assumeTeamsOversubscription, assumeThreadsOversubscription,
+ assumeNoThreadState, assumeNoNestedParallelism));
+ }]>,
];
}
--- /dev/null
+// RUN: mlir-opt %s | mlir-opt | FileCheck %s
+
+// CHECK: module attributes {omp.flags = #omp.flags<>} {
+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: module attributes {omp.flags = #omp.flags<debug_kind = 20>} {
+module attributes {omp.flags = #omp.flags<debug_kind = 20, assume_teams_oversubscription = false, assume_threads_oversubscription = false, assume_no_thread_state = false, assume_no_nested_parallelism = false>} {}
+
+// CHECK: module attributes {omp.flags = #omp.flags<debug_kind = 100, assume_teams_oversubscription = true>} {
+module attributes {omp.flags = #omp.flags<debug_kind = 100, assume_teams_oversubscription = true, assume_threads_oversubscription = false, assume_no_thread_state = false, assume_no_nested_parallelism = false>} {}
+
+// CHECK: module attributes {omp.flags = #omp.flags<debug_kind = 200, assume_teams_oversubscription = true, assume_threads_oversubscription = true>} {
+module attributes {omp.flags = #omp.flags<debug_kind = 200, assume_teams_oversubscription = true, assume_threads_oversubscription = true, assume_no_thread_state = false, assume_no_nested_parallelism = false>} {}
+
+// CHECK: module attributes {omp.flags = #omp.flags<debug_kind = 300, assume_teams_oversubscription = true, assume_threads_oversubscription = true, assume_no_thread_state = true>} {
+module attributes {omp.flags = #omp.flags<debug_kind = 300, assume_teams_oversubscription = true, assume_threads_oversubscription = true, assume_no_thread_state = true, assume_no_nested_parallelism = false>} {}
+
+// CHECK: module attributes {omp.flags = #omp.flags<debug_kind = 400, assume_teams_oversubscription = true, assume_threads_oversubscription = true, assume_no_thread_state = true, assume_no_nested_parallelism = true>} {
+module attributes {omp.flags = #omp.flags<debug_kind = 400, assume_teams_oversubscription = true, assume_threads_oversubscription = true, assume_no_thread_state = true, assume_no_nested_parallelism = true>} {}
+
+// CHECK: module attributes {omp.flags = #omp.flags<>} {
+module attributes {omp.flags = #omp.flags<>} {}
+
+// CHECK: module attributes {omp.flags = #omp.flags<assume_teams_oversubscription = true>} {
+module attributes {omp.flags = #omp.flags<assume_teams_oversubscription = true>} {}
+
+// CHECK: module attributes {omp.flags = #omp.flags<assume_teams_oversubscription = true, assume_no_thread_state = true>} {
+module attributes {omp.flags = #omp.flags<assume_teams_oversubscription = true, assume_no_thread_state = true>} {}
+
+// CHECK: module attributes {omp.flags = #omp.flags<assume_teams_oversubscription = true, assume_no_thread_state = true>} {
+module attributes {omp.flags = #omp.flags<assume_no_thread_state = true, assume_teams_oversubscription = true>} {}