forked from OSchip/llvm-project
[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:
parent
8975aa6ea8
commit
92a295eb39
|
@ -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<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;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
Loading…
Reference in New Issue