[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
This commit is contained in:
Kiran Chandramohan 2020-03-04 23:36:21 +00:00
parent 8975aa6ea8
commit 92a295eb39
4 changed files with 38 additions and 3 deletions

View File

@ -19,6 +19,7 @@
#include "mlir/IR/Module.h" #include "mlir/IR/Module.h"
#include "mlir/IR/Value.h" #include "mlir/IR/Value.h"
#include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
#include "llvm/IR/BasicBlock.h" #include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Function.h" #include "llvm/IR/Function.h"
#include "llvm/IR/IRBuilder.h" #include "llvm/IR/IRBuilder.h"
@ -103,6 +104,11 @@ private:
/// A converter for translating debug information. /// A converter for translating debug information.
std::unique_ptr<detail::DebugTranslation> debugTranslation; 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. /// Mappings between llvm.mlir.global definitions and corresponding globals.
DenseMap<Operation *, llvm::GlobalValue *> globalsMapping; DenseMap<Operation *, llvm::GlobalValue *> globalsMapping;

View File

@ -4,8 +4,8 @@ add_mlir_dialect_library(MLIRLLVMIR
ADDITIONAL_HEADER_DIRS ADDITIONAL_HEADER_DIRS
${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/LLVMIR ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/LLVMIR
) )
add_dependencies(MLIRLLVMIR MLIRLLVMOpsIncGen MLIRLLVMConversionsIncGen LLVMAsmParser LLVMCore LLVMSupport) add_dependencies(MLIRLLVMIR MLIRLLVMOpsIncGen MLIRLLVMConversionsIncGen MLIROpenMP LLVMFrontendOpenMP LLVMAsmParser LLVMCore LLVMSupport)
target_link_libraries(MLIRLLVMIR LLVMAsmParser LLVMCore LLVMSupport MLIRIR) target_link_libraries(MLIRLLVMIR LLVMAsmParser LLVMCore LLVMSupport LLVMFrontendOpenMP MLIROpenMP MLIRIR)
add_mlir_dialect_library(MLIRNVVMIR add_mlir_dialect_library(MLIRNVVMIR
IR/NVVMDialect.cpp IR/NVVMDialect.cpp

View File

@ -15,12 +15,14 @@
#include "DebugTranslation.h" #include "DebugTranslation.h"
#include "mlir/Dialect/LLVMIR/LLVMDialect.h" #include "mlir/Dialect/LLVMIR/LLVMDialect.h"
#include "mlir/Dialect/OpenMP/OpenMPDialect.h"
#include "mlir/IR/Attributes.h" #include "mlir/IR/Attributes.h"
#include "mlir/IR/Module.h" #include "mlir/IR/Module.h"
#include "mlir/IR/StandardTypes.h" #include "mlir/IR/StandardTypes.h"
#include "mlir/Support/LLVM.h" #include "mlir/Support/LLVM.h"
#include "llvm/ADT/SetVector.h" #include "llvm/ADT/SetVector.h"
#include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
#include "llvm/IR/BasicBlock.h" #include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Constants.h" #include "llvm/IR/Constants.h"
#include "llvm/IR/DerivedTypes.h" #include "llvm/IR/DerivedTypes.h"
@ -271,7 +273,9 @@ ModuleTranslation::ModuleTranslation(Operation *module,
std::unique_ptr<llvm::Module> llvmModule) std::unique_ptr<llvm::Module> llvmModule)
: mlirModule(module), llvmModule(std::move(llvmModule)), : mlirModule(module), llvmModule(std::move(llvmModule)),
debugTranslation( debugTranslation(
std::make_unique<DebugTranslation>(module, *this->llvmModule)) { std::make_unique<DebugTranslation>(module, *this->llvmModule)),
ompDialect(
module->getContext()->getRegisteredDialect<omp::OpenMPDialect>()) {
assert(satisfiesLLVMModule(mlirModule) && assert(satisfiesLLVMModule(mlirModule) &&
"mlirModule should honor LLVM's module semantics."); "mlirModule should honor LLVM's module semantics.");
} }
@ -374,6 +378,21 @@ LogicalResult ModuleTranslation::convertOperation(Operation &opInst,
return success(); 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: ") return opInst.emitError("unsupported or non-LLVM operation: ")
<< opInst.getName(); << opInst.getName();
} }

View File

@ -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
}