From 92a295eb399508b7d8dd577950cd33426ca5ae91 Mon Sep 17 00:00:00 2001 From: Kiran Chandramohan Date: Wed, 4 Mar 2020 23:36:21 +0000 Subject: [PATCH] [MLIR, OpenMP] Translation of OpenMP barrier construct to LLVM IR Summary: This patch adds support for translation of the OpenMP barrier construct to LLVM IR. The OpenMP IRBuilder is used for this translation. In this patch the code for translation is added to the existing LLVM dialect translation to LLVM IR. The patch includes code changes and a testcase. Reviewers: jdoerfert, nicolasvasilache, ftynse, rriddle, mehdi_amini Reviewed By: ftynse, rriddle, mehdi_amini Differential Revision: https://reviews.llvm.org/D72962 --- mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h | 6 ++++++ mlir/lib/Dialect/LLVMIR/CMakeLists.txt | 4 ++-- mlir/lib/Target/LLVMIR/ModuleTranslation.cpp | 21 ++++++++++++++++++++- mlir/test/Target/openmp-llvm.mlir | 10 ++++++++++ 4 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 mlir/test/Target/openmp-llvm.mlir diff --git a/mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h b/mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h index 84ee37a..fd6dc88 100644 --- a/mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h +++ b/mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h @@ -19,6 +19,7 @@ #include "mlir/IR/Module.h" #include "mlir/IR/Value.h" +#include "llvm/Frontend/OpenMP/OMPIRBuilder.h" #include "llvm/IR/BasicBlock.h" #include "llvm/IR/Function.h" #include "llvm/IR/IRBuilder.h" @@ -103,6 +104,11 @@ private: /// A converter for translating debug information. std::unique_ptr debugTranslation; + /// Builder for LLVM IR generation of OpenMP constructs. + std::unique_ptr ompBuilder; + /// Precomputed pointer to OpenMP dialect. + const Dialect *ompDialect; + /// Mappings between llvm.mlir.global definitions and corresponding globals. DenseMap globalsMapping; diff --git a/mlir/lib/Dialect/LLVMIR/CMakeLists.txt b/mlir/lib/Dialect/LLVMIR/CMakeLists.txt index b0c4eb2..8eafbd8 100644 --- a/mlir/lib/Dialect/LLVMIR/CMakeLists.txt +++ b/mlir/lib/Dialect/LLVMIR/CMakeLists.txt @@ -4,8 +4,8 @@ add_mlir_dialect_library(MLIRLLVMIR ADDITIONAL_HEADER_DIRS ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/LLVMIR ) -add_dependencies(MLIRLLVMIR MLIRLLVMOpsIncGen MLIRLLVMConversionsIncGen LLVMAsmParser LLVMCore LLVMSupport) -target_link_libraries(MLIRLLVMIR LLVMAsmParser LLVMCore LLVMSupport MLIRIR) +add_dependencies(MLIRLLVMIR MLIRLLVMOpsIncGen MLIRLLVMConversionsIncGen MLIROpenMP LLVMFrontendOpenMP LLVMAsmParser LLVMCore LLVMSupport) +target_link_libraries(MLIRLLVMIR LLVMAsmParser LLVMCore LLVMSupport LLVMFrontendOpenMP MLIROpenMP MLIRIR) add_mlir_dialect_library(MLIRNVVMIR IR/NVVMDialect.cpp diff --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp index 84985fc..6efc90d 100644 --- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp @@ -15,12 +15,14 @@ #include "DebugTranslation.h" #include "mlir/Dialect/LLVMIR/LLVMDialect.h" +#include "mlir/Dialect/OpenMP/OpenMPDialect.h" #include "mlir/IR/Attributes.h" #include "mlir/IR/Module.h" #include "mlir/IR/StandardTypes.h" #include "mlir/Support/LLVM.h" #include "llvm/ADT/SetVector.h" +#include "llvm/Frontend/OpenMP/OMPIRBuilder.h" #include "llvm/IR/BasicBlock.h" #include "llvm/IR/Constants.h" #include "llvm/IR/DerivedTypes.h" @@ -271,7 +273,9 @@ ModuleTranslation::ModuleTranslation(Operation *module, std::unique_ptr llvmModule) : mlirModule(module), llvmModule(std::move(llvmModule)), debugTranslation( - std::make_unique(module, *this->llvmModule)) { + std::make_unique(module, *this->llvmModule)), + ompDialect( + module->getContext()->getRegisteredDialect()) { assert(satisfiesLLVMModule(mlirModule) && "mlirModule should honor LLVM's module semantics."); } @@ -374,6 +378,21 @@ LogicalResult ModuleTranslation::convertOperation(Operation &opInst, return success(); } + if (opInst.getDialect() == ompDialect) { + if (!ompBuilder) { + ompBuilder = + std::move(std::make_unique(*llvmModule)); + ompBuilder->initialize(); + } + + if (isa(opInst)) { + ompBuilder->CreateBarrier(builder.saveIP(), llvm::omp::OMPD_barrier); + return success(); + } + return opInst.emitError("unsupported OpenMP operation: ") + << opInst.getName(); + } + return opInst.emitError("unsupported or non-LLVM operation: ") << opInst.getName(); } diff --git a/mlir/test/Target/openmp-llvm.mlir b/mlir/test/Target/openmp-llvm.mlir new file mode 100644 index 0000000..fd9c6bc --- /dev/null +++ b/mlir/test/Target/openmp-llvm.mlir @@ -0,0 +1,10 @@ +// RUN: mlir-translate -mlir-to-llvmir %s | FileCheck %s + +// CHECK-LABEL: define void @empty() +// CHECK: [[OMP_THREAD:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @{{[0-9]+}}) +// CHECK-NEXT: call void @__kmpc_barrier(%struct.ident_t* @{{[0-9]+}}, i32 [[OMP_THREAD]]) +// CHECK-NEXT: ret void +llvm.func @empty() { + omp.barrier + llvm.return +} -- 2.7.4