mirror of
https://github.com/intel/llvm.git
synced 2026-01-25 01:07:04 +08:00
[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:
@@ -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();
|
||||
}
|
||||
|
||||
10
mlir/test/Target/openmp-llvm.mlir
Normal file
10
mlir/test/Target/openmp-llvm.mlir
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user