Commit 92a295eb authored by Kiran Chandramohan's avatar Kiran Chandramohan
Browse files

[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
parent 8975aa6e
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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;

+2 −2
Original line number Diff line number Diff line
@@ -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
+20 −1
Original line number Diff line number Diff line
@@ -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 −0
Original line number Diff line number Diff line
// 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
}