diff --git a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp --- a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp @@ -1573,7 +1573,8 @@ .getAssumeNoNestedParallelism() /*LangOpts().OpenMPNoNestedParallelism*/ , "__omp_rtl_assume_no_nested_parallelism"); - + ompBuilder->M.addModuleFlag(llvm::Module::Max, "openmp-device", + attribute.getOpenmpDeviceVersion()); return success(); } @@ -1701,6 +1702,13 @@ .Case([&](mlir::omp::FlagsAttr rtlAttr) { return convertFlagsAttr(op, rtlAttr, moduleTranslation); }) + .Case([&](mlir::omp::VersionAttr versionAttr) { + llvm::OpenMPIRBuilder *ompBuilder = + moduleTranslation.getOpenMPBuilder(); + ompBuilder->M.addModuleFlag(llvm::Module::Max, "openmp", + versionAttr.getVersion()); + return success(); + }) .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 diff --git a/mlir/test/Target/LLVMIR/openmp-llvm.mlir b/mlir/test/Target/LLVMIR/openmp-llvm.mlir --- a/mlir/test/Target/LLVMIR/openmp-llvm.mlir +++ b/mlir/test/Target/LLVMIR/openmp-llvm.mlir @@ -2472,10 +2472,37 @@ // 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 +// CHECK: [[META0:![0-9]+]] = !{i32 7, !"openmp-device", i32 50} 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 +// CHECK: [[META0:![0-9]+]] = !{i32 7, !"openmp-device", i32 51} +module attributes {omp.flags = #omp.flags<openmp_device_version = 51>} {} + +// ----- + +// 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 +// CHECK: [[META0:![0-9]+]] = !{i32 7, !"openmp-device", i32 50} +// CHECK: [[META0:![0-9]+]] = !{i32 7, !"openmp", i32 50} +module attributes {omp.version = #omp.version<version = 50>, omp.flags = #omp.flags<>} {} + +// ----- + +// CHECK: [[META0:![0-9]+]] = !{i32 7, !"openmp", i32 51} +// CHECK-NOT: [[META0:![0-9]+]] = !{i32 7, !"openmp-device", i32 50} +module attributes {omp.version = #omp.version<version = 51>} {} + +// ----- // 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