HLFIRDialect
HLFIRTransforms
MLIRTransforms
+ MLIRBuiltinToLLVMIRTranslation
MLIRLLVMToLLVMIRTranslation
MLIRSCFToControlFlow
MLIRTargetLLVMIRImport
MLIRMathToLLVM
MLIRMathToLibm
MLIROpenMPToLLVM
+ MLIRBuiltinToLLVMIRTranslation
MLIRLLVMToLLVMIRTranslation
MLIRTargetLLVMIRExport
LINK_LIBS
FIRDialectSupport
MLIRArithDialect
+ MLIRBuiltinToLLVMIRTranslation
MLIROpenMPToLLVM
MLIRLLVMToLLVMIRTranslation
MLIRTargetLLVMIRExport
LINK_LIBS
${dialect_libs}
+ MLIRBuiltinToLLVMIRTranslation
MLIROpenMPToLLVMIRTranslation
MLIRLLVMToLLVMIRTranslation
MLIRTargetLLVMIRExport
//===----------------------------------------------------------------------===//
#include "flang/Optimizer/Support/InitFIR.h"
+#include "mlir/Target/LLVMIR/Dialect/Builtin/BuiltinToLLVMIRTranslation.h"
#include "mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h"
#include "mlir/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.h"
void fir::support::registerLLVMTranslation(mlir::MLIRContext &context) {
mlir::DialectRegistry registry;
// Register OpenMP dialect interface here as well.
- mlir::registerOpenMPDialectTranslation(registry);
+ registerOpenMPDialectTranslation(registry);
// Register LLVM-IR dialect interface.
registerLLVMDialectTranslation(registry);
+ // Register builtin dialect interface.
+ registerBuiltinDialectTranslation(registry);
context.appendDialectRegistry(registry);
}
${dialect_libs}
MLIRIR
MLIRLLVMDialect
+ MLIRBuiltinToLLVMIRTranslation
MLIRLLVMToLLVMIRTranslation
MLIRTargetLLVMIRExport
MLIRPass
${dialect_libs}
${conversion_libs}
MLIRAnalysis
+ MLIRBuiltinToLLVMIRTranslation
MLIRCallInterfaces
MLIRCastInterfaces
MLIRExecutionEngine
#include "mlir/Parser/Parser.h"
#include "mlir/Pass/Pass.h"
#include "mlir/Pass/PassManager.h"
+#include "mlir/Target/LLVMIR/Dialect/Builtin/BuiltinToLLVMIRTranslation.h"
#include "mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h"
#include "mlir/Target/LLVMIR/Export.h"
#include "mlir/Transforms/Passes.h"
int dumpLLVMIR(mlir::ModuleOp module) {
// Register the translation to LLVM IR with the MLIR context.
+ mlir::registerBuiltinDialectTranslation(*module->getContext());
mlir::registerLLVMDialectTranslation(*module->getContext());
// Convert the module to LLVM IR in a new LLVM IR context.
// Register the translation from MLIR to LLVM IR, which must happen before we
// can JIT-compile.
+ mlir::registerBuiltinDialectTranslation(*module->getContext());
mlir::registerLLVMDialectTranslation(*module->getContext());
// An optimization pipeline to use within the execution engine.
${dialect_libs}
${conversion_libs}
MLIRAnalysis
+ MLIRBuiltinToLLVMIRTranslation
MLIRCallInterfaces
MLIRCastInterfaces
MLIRExecutionEngine
#include "mlir/Parser/Parser.h"
#include "mlir/Pass/Pass.h"
#include "mlir/Pass/PassManager.h"
+#include "mlir/Target/LLVMIR/Dialect/Builtin/BuiltinToLLVMIRTranslation.h"
#include "mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h"
#include "mlir/Target/LLVMIR/Export.h"
#include "mlir/Transforms/Passes.h"
int dumpLLVMIR(mlir::ModuleOp module) {
// Register the translation to LLVM IR with the MLIR context.
+ mlir::registerBuiltinDialectTranslation(*module->getContext());
mlir::registerLLVMDialectTranslation(*module->getContext());
// Convert the module to LLVM IR in a new LLVM IR context.
// Register the translation from MLIR to LLVM IR, which must happen before we
// can JIT-compile.
+ mlir::registerBuiltinDialectTranslation(*module->getContext());
mlir::registerLLVMDialectTranslation(*module->getContext());
// An optimization pipeline to use within the execution engine.
#include "mlir/Target/LLVMIR/Dialect/AMX/AMXToLLVMIRTranslation.h"
#include "mlir/Target/LLVMIR/Dialect/ArmNeon/ArmNeonToLLVMIRTranslation.h"
#include "mlir/Target/LLVMIR/Dialect/ArmSVE/ArmSVEToLLVMIRTranslation.h"
+#include "mlir/Target/LLVMIR/Dialect/Builtin/BuiltinToLLVMIRTranslation.h"
+#include "mlir/Target/LLVMIR/Dialect/GPU/GPUToLLVMIRTranslation.h"
#include "mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMIRToLLVMTranslation.h"
#include "mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h"
#include "mlir/Target/LLVMIR/Dialect/NVVM/NVVMToLLVMIRTranslation.h"
registerArmNeonDialectTranslation(registry);
registerAMXDialectTranslation(registry);
registerArmSVEDialectTranslation(registry);
+ registerBuiltinDialectTranslation(registry);
+ registerGPUDialectTranslation(registry);
registerLLVMDialectTranslation(registry);
registerNVVMDialectTranslation(registry);
registerOpenACCDialectTranslation(registry);
--- /dev/null
+//==- BuiltinToLLVMIRTranslation.h - Builtin Dialect to LLVM IR -*- C++ -*-==//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This provides registration calls for builtin dialect to LLVM IR translation.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef MLIR_TARGET_LLVMIR_DIALECT_BUILTIN_BUILTINTOLLVMIRTRANSLATION_H
+#define MLIR_TARGET_LLVMIR_DIALECT_BUILTIN_BUILTINTOLLVMIRTRANSLATION_H
+
+namespace mlir {
+
+class DialectRegistry;
+class MLIRContext;
+
+/// Register the translation from the builtin dialect to the LLVM IR in the
+/// given registry.
+void registerBuiltinDialectTranslation(DialectRegistry ®istry);
+
+/// Register the translation from the builtin dialect in the registry associated
+/// with the given context.
+void registerBuiltinDialectTranslation(MLIRContext &context);
+
+} // namespace mlir
+
+#endif // MLIR_TARGET_LLVMIR_DIALECT_BUILTIN_BUILTINTOLLVMIRTRANSLATION_H
--- /dev/null
+//===- GPUToLLVMIRTranslation.h - GPU Dialect to LLVM IR --------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This provides registration calls for GPU dialect to LLVM IR translation.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef MLIR_TARGET_LLVMIR_DIALECT_GPU_GPUTOLLVMIRTRANSLATION_H
+#define MLIR_TARGET_LLVMIR_DIALECT_GPU_GPUTOLLVMIRTRANSLATION_H
+
+namespace mlir {
+
+class DialectRegistry;
+class MLIRContext;
+
+/// Register the GPU dialect and the translation from it to the LLVM IR in
+/// the given registry;
+void registerGPUDialectTranslation(DialectRegistry ®istry);
+
+/// Register the GPU dialect and the translation from it in the registry
+/// associated with the given context.
+void registerGPUDialectTranslation(MLIRContext &context);
+
+} // namespace mlir
+
+#endif // MLIR_TARGET_LLVMIR_DIALECT_GPU_GPUTOLLVMIRTRANSLATION_H
ExecutionEngine.cpp
LINK_LIBS PUBLIC
+ MLIRBuiltinToLLVMIRTranslation
MLIRExecutionEngine
MLIRLLVMToLLVMIRTranslation
)
#include "mlir/CAPI/IR.h"
#include "mlir/CAPI/Support.h"
#include "mlir/ExecutionEngine/OptUtils.h"
+#include "mlir/Target/LLVMIR/Dialect/Builtin/BuiltinToLLVMIRTranslation.h"
#include "mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h"
#include "llvm/ExecutionEngine/Orc/Mangling.h"
#include "llvm/Support/TargetSelect.h"
}();
(void)initOnce;
- mlir::registerLLVMDialectTranslation(*unwrap(op)->getContext());
+ auto &ctx = *unwrap(op)->getContext();
+ mlir::registerBuiltinDialectTranslation(ctx);
+ mlir::registerLLVMDialectTranslation(ctx);
auto tmBuilderOrError = llvm::orc::JITTargetMachineBuilder::detectHost();
if (!tmBuilderOrError) {
${translation_libs}
${conversion_libs}
+ MLIRBuiltinToLLVMIRTranslation
MLIRCAPIIR
MLIRLLVMToLLVMIRTranslation
MLIRCAPITransforms
#include "mlir/CAPI/IR.h"
#include "mlir/InitAllDialects.h"
#include "mlir/InitAllPasses.h"
+#include "mlir/Target/LLVMIR/Dialect/Builtin/BuiltinToLLVMIRTranslation.h"
#include "mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h"
void mlirRegisterAllDialects(MlirDialectRegistry registry) {
}
void mlirRegisterAllLLVMTranslations(MlirContext context) {
- mlir::registerLLVMDialectTranslation(*unwrap(context));
+ auto &ctx = *unwrap(context);
+ mlir::registerBuiltinDialectTranslation(ctx);
+ mlir::registerLLVMDialectTranslation(ctx);
}
void mlirRegisterAllPasses() { mlir::registerAllPasses(); }
MLIRAffineUtils
MLIRArithDialect
MLIRAsyncDialect
+ MLIRBuiltinToLLVMIRTranslation
MLIRDataLayoutInterfaces
MLIRExecutionEngineUtils
MLIRGPUOps
MLIRIR
MLIRLLVMDialect
+ MLIRGPUToLLVMIRTranslation
MLIRLLVMToLLVMIRTranslation
MLIRMemRefDialect
MLIRPass
#include "mlir/Dialect/GPU/Transforms/Passes.h"
#include "mlir/Pass/Pass.h"
+#include "mlir/Target/LLVMIR/Dialect/GPU/GPUToLLVMIRTranslation.h"
#include "mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h"
#include "mlir/Target/LLVMIR/Export.h"
#include "llvm/IR/LegacyPassManager.h"
void gpu::SerializeToBlobPass::getDependentDialects(
DialectRegistry ®istry) const {
+ registerGPUDialectTranslation(registry);
registerLLVMDialectTranslation(registry);
OperationPass<gpu::GPUModuleOp>::getDependentDialects(registry);
}
${LLVM_JIT_LISTENER_LIB}
LINK_LIBS PUBLIC
+ MLIRBuiltinToLLVMIRTranslation
MLIRExecutionEngineUtils
MLIRLLVMDialect
MLIRLLVMToLLVMIRTranslation
MLIRArmNeonToLLVMIRTranslation
MLIRArmSVEToLLVMIRTranslation
MLIRAMXToLLVMIRTranslation
+ MLIRBuiltinToLLVMIRTranslation
+ MLIRGPUToLLVMIRTranslation
MLIRX86VectorToLLVMIRTranslation
MLIRLLVMToLLVMIRTranslation
MLIRNVVMToLLVMIRTranslation
--- /dev/null
+//===- BuiltinToLLVMIRTranslation.cpp - Translate builtin to LLVM IR ------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file implements a translation between the MLIR builtin dialect and LLVM
+// IR.
+//
+//===----------------------------------------------------------------------===//
+#include "mlir/Target/LLVMIR/Dialect/Builtin/BuiltinToLLVMIRTranslation.h"
+#include "mlir/IR/BuiltinDialect.h"
+#include "mlir/IR/BuiltinOps.h"
+#include "mlir/Target/LLVMIR/LLVMTranslationInterface.h"
+
+using namespace mlir;
+
+namespace {
+
+class BuiltinDialectLLVMIRTranslationInterface
+ : public LLVMTranslationDialectInterface {
+public:
+ using LLVMTranslationDialectInterface::LLVMTranslationDialectInterface;
+
+ LogicalResult
+ convertOperation(Operation *op, llvm::IRBuilderBase &builder,
+ LLVM::ModuleTranslation &moduleTranslation) const override {
+ return success(isa<ModuleOp>(op));
+ }
+};
+
+} // namespace
+
+void mlir::registerBuiltinDialectTranslation(DialectRegistry ®istry) {
+ registry.addExtension(+[](MLIRContext *ctx, BuiltinDialect *dialect) {
+ dialect->addInterfaces<BuiltinDialectLLVMIRTranslationInterface>();
+ });
+}
+
+void mlir::registerBuiltinDialectTranslation(MLIRContext &context) {
+ DialectRegistry registry;
+ registerBuiltinDialectTranslation(registry);
+ context.appendDialectRegistry(registry);
+}
--- /dev/null
+add_mlir_translation_library(MLIRBuiltinToLLVMIRTranslation
+ BuiltinToLLVMIRTranslation.cpp
+
+ LINK_COMPONENTS
+ Core
+
+ LINK_LIBS PUBLIC
+ MLIRIR
+ MLIRLLVMDialect
+ MLIRSupport
+ MLIRTargetLLVMIRExport
+ )
add_subdirectory(ArmNeon)
add_subdirectory(ArmSVE)
add_subdirectory(AMX)
+add_subdirectory(Builtin)
+add_subdirectory(GPU)
add_subdirectory(LLVMIR)
add_subdirectory(NVVM)
add_subdirectory(OpenACC)
--- /dev/null
+add_mlir_translation_library(MLIRGPUToLLVMIRTranslation
+ GPUToLLVMIRTranslation.cpp
+
+ LINK_COMPONENTS
+ Core
+
+ LINK_LIBS PUBLIC
+ MLIRIR
+ MLIRGPUOps
+ MLIRLLVMDialect
+ MLIRSupport
+ MLIRTargetLLVMIRExport
+ )
--- /dev/null
+//===- GPUToLLVMIRTranslation.cpp - Translate GPU dialect to LLVM IR ------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file implements a translation between the MLIR GPU dialect and LLVM IR.
+//
+//===----------------------------------------------------------------------===//
+#include "mlir/Target/LLVMIR/Dialect/GPU/GPUToLLVMIRTranslation.h"
+#include "mlir/Dialect/GPU/IR/GPUDialect.h"
+#include "mlir/Target/LLVMIR/LLVMTranslationInterface.h"
+
+using namespace mlir;
+
+namespace {
+
+class GPUDialectLLVMIRTranslationInterface
+ : public LLVMTranslationDialectInterface {
+public:
+ using LLVMTranslationDialectInterface::LLVMTranslationDialectInterface;
+
+ LogicalResult
+ convertOperation(Operation *op, llvm::IRBuilderBase &builder,
+ LLVM::ModuleTranslation &moduleTranslation) const override {
+ return isa<gpu::GPUModuleOp>(op) ? success() : failure();
+ }
+};
+
+} // namespace
+
+void mlir::registerGPUDialectTranslation(DialectRegistry ®istry) {
+ registry.insert<gpu::GPUDialect>();
+ registry.addExtension(+[](MLIRContext *ctx, gpu::GPUDialect *dialect) {
+ dialect->addInterfaces<GPUDialectLLVMIRTranslationInterface>();
+ });
+}
+
+void mlir::registerGPUDialectTranslation(MLIRContext &context) {
+ DialectRegistry registry;
+ registerGPUDialectTranslation(registry);
+ context.appendDialectRegistry(registry);
+}
}
}
+ // Convert module itself.
+ if (failed(translator.convertOperation(*module, llvmBuilder)))
+ return nullptr;
+
if (llvm::verifyModule(*translator.llvmModule, &llvm::errs()))
return nullptr;
llvm_update_compile_flags(mlir-cpu-runner)
target_link_libraries(mlir-cpu-runner PRIVATE
MLIRAnalysis
+ MLIRBuiltinToLLVMIRTranslation
MLIRExecutionEngine
MLIRIR
MLIRJitRunner
${conversion_libs}
MLIRAnalysis
MLIRArithDialect
+ MLIRBuiltinToLLVMIRTranslation
MLIRExecutionEngine
MLIRFuncDialect
MLIRGPUOps
${conversion_libs}
MLIRAnalysis
MLIRArithDialect
+ MLIRBuiltinToLLVMIRTranslation
MLIRExecutionEngine
MLIRFuncDialect
MLIRGPUOps
#include "mlir/InitAllDialects.h"
#include "mlir/Parser/Parser.h"
#include "mlir/Pass/PassManager.h"
+#include "mlir/Target/LLVMIR/Dialect/Builtin/BuiltinToLLVMIRTranslation.h"
#include "mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h"
#include "mlir/Target/LLVMIR/Export.h"
#include "llvm/Support/TargetSelect.h"
)mlir";
DialectRegistry registry;
registerAllDialects(registry);
+ registerBuiltinDialectTranslation(registry);
registerLLVMDialectTranslation(registry);
MLIRContext context(registry);
OwningOpRef<ModuleOp> module =
)mlir";
DialectRegistry registry;
registerAllDialects(registry);
+ registerBuiltinDialectTranslation(registry);
registerLLVMDialectTranslation(registry);
MLIRContext context(registry);
OwningOpRef<ModuleOp> module =
)mlir";
DialectRegistry registry;
registerAllDialects(registry);
+ registerBuiltinDialectTranslation(registry);
registerLLVMDialectTranslation(registry);
MLIRContext context(registry);
auto module = parseSourceString<ModuleOp>(moduleStr, &context);
)mlir";
DialectRegistry registry;
registerAllDialects(registry);
+ registerBuiltinDialectTranslation(registry);
registerLLVMDialectTranslation(registry);
MLIRContext context(registry);
auto module = parseSourceString<ModuleOp>(moduleStr, &context);
)mlir";
DialectRegistry registry;
registerAllDialects(registry);
+ registerBuiltinDialectTranslation(registry);
registerLLVMDialectTranslation(registry);
MLIRContext context(registry);
OwningOpRef<ModuleOp> module =
)mlir";
DialectRegistry registry;
registerAllDialects(registry);
+ registerBuiltinDialectTranslation(registry);
registerLLVMDialectTranslation(registry);
MLIRContext context(registry);
auto module = parseSourceString<ModuleOp>(moduleStr, &context);