[Mlir-commits] [mlir] 92a295e - [MLIR, OpenMP] Translation of OpenMP barrier construct to LLVM IR
Kiran Chandramohan
llvmlistbot at llvm.org
Thu Mar 5 04:06:35 PST 2020
Author: Kiran Chandramohan
Date: 2020-03-05T11:59:36Z
New Revision: 92a295eb399508b7d8dd577950cd33426ca5ae91
URL: https://github.com/llvm/llvm-project/commit/92a295eb399508b7d8dd577950cd33426ca5ae91
DIFF: https://github.com/llvm/llvm-project/commit/92a295eb399508b7d8dd577950cd33426ca5ae91.diff
LOG: [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
Added:
mlir/test/Target/openmp-llvm.mlir
Modified:
mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h
mlir/lib/Dialect/LLVMIR/CMakeLists.txt
mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
Removed:
################################################################################
diff --git a/mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h b/mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h
index 84ee37a8cc54..fd6dc881fe37 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 @@ class ModuleTranslation {
/// A converter for translating debug information.
std::unique_ptr<detail::DebugTranslation> debugTranslation;
+ /// Builder for LLVM IR generation of OpenMP constructs.
+ std::unique_ptr<llvm::OpenMPIRBuilder> ompBuilder;
+ /// Precomputed pointer to OpenMP dialect.
+ const Dialect *ompDialect;
+
/// Mappings between llvm.mlir.global definitions and corresponding globals.
DenseMap<Operation *, llvm::GlobalValue *> globalsMapping;
diff --git a/mlir/lib/Dialect/LLVMIR/CMakeLists.txt b/mlir/lib/Dialect/LLVMIR/CMakeLists.txt
index b0c4eb241381..8eafbd8a2179 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 84985fc68651..6efc90daf330 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<llvm::Module> llvmModule)
: mlirModule(module), llvmModule(std::move(llvmModule)),
debugTranslation(
- std::make_unique<DebugTranslation>(module, *this->llvmModule)) {
+ std::make_unique<DebugTranslation>(module, *this->llvmModule)),
+ ompDialect(
+ module->getContext()->getRegisteredDialect<omp::OpenMPDialect>()) {
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<llvm::OpenMPIRBuilder>(*llvmModule));
+ ompBuilder->initialize();
+ }
+
+ if (isa<omp::BarrierOp>(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 000000000000..fd9c6bc583c2
--- /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
+}
More information about the Mlir-commits
mailing list