1 //===- ConvertToLLVMIR.cpp - MLIR to LLVM IR conversion -------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file implements a translation between the MLIR LLVM dialect and LLVM IR.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "mlir/Target/LLVMIR.h"
14 
15 #include "mlir/Dialect/LLVMIR/LLVMAVX512Dialect.h"
16 #include "mlir/Dialect/LLVMIR/LLVMArmNeonDialect.h"
17 #include "mlir/Dialect/LLVMIR/LLVMArmSVEDialect.h"
18 #include "mlir/Dialect/LLVMIR/NVVMDialect.h"
19 #include "mlir/Dialect/LLVMIR/ROCDLDialect.h"
20 #include "mlir/Dialect/OpenMP/OpenMPDialect.h"
21 #include "mlir/Target/LLVMIR/Dialect/LLVMAVX512/LLVMAVX512ToLLVMIRTranslation.h"
22 #include "mlir/Target/LLVMIR/Dialect/LLVMArmNeon/LLVMArmNeonToLLVMIRTranslation.h"
23 #include "mlir/Target/LLVMIR/Dialect/LLVMArmSVE/LLVMArmSVEToLLVMIRTranslation.h"
24 #include "mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h"
25 #include "mlir/Target/LLVMIR/Dialect/NVVM/NVVMToLLVMIRTranslation.h"
26 #include "mlir/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.h"
27 #include "mlir/Target/LLVMIR/Dialect/ROCDL/ROCDLToLLVMIRTranslation.h"
28 #include "mlir/Target/LLVMIR/ModuleTranslation.h"
29 #include "mlir/Translation.h"
30 
31 #include "llvm/ADT/StringRef.h"
32 #include "llvm/IR/Module.h"
33 #include "llvm/IR/Verifier.h"
34 #include "llvm/Support/ToolOutputFile.h"
35 
36 using namespace mlir;
37 
38 void mlir::registerLLVMDialectTranslation(DialectRegistry &registry) {
39   registry.insert<LLVM::LLVMDialect>();
40   registry.addDialectInterface<LLVM::LLVMDialect,
41                                LLVMDialectLLVMIRTranslationInterface>();
42 }
43 
44 void mlir::registerLLVMDialectTranslation(MLIRContext &context) {
45   auto *dialect = context.getLoadedDialect<LLVM::LLVMDialect>();
46   if (!dialect || dialect->getRegisteredInterface<
47                       LLVMDialectLLVMIRTranslationInterface>() == nullptr) {
48     DialectRegistry registry;
49     registry.insert<LLVM::LLVMDialect>();
50     registry.addDialectInterface<LLVM::LLVMDialect,
51                                  LLVMDialectLLVMIRTranslationInterface>();
52     context.appendDialectRegistry(registry);
53   }
54 }
55 
56 namespace mlir {
57 void registerToLLVMIRTranslation() {
58   TranslateFromMLIRRegistration registration(
59       "mlir-to-llvmir",
60       [](ModuleOp module, raw_ostream &output) {
61         llvm::LLVMContext llvmContext;
62         auto llvmModule = translateModuleToLLVMIR(module, llvmContext);
63         if (!llvmModule)
64           return failure();
65 
66         llvmModule->print(output, nullptr);
67         return success();
68       },
69       [](DialectRegistry &registry) {
70         registry.insert<omp::OpenMPDialect, LLVM::LLVMAVX512Dialect,
71                         LLVM::LLVMArmSVEDialect, LLVM::LLVMArmNeonDialect,
72                         NVVM::NVVMDialect, ROCDL::ROCDLDialect>();
73         registry.addDialectInterface<omp::OpenMPDialect,
74                                      OpenMPDialectLLVMIRTranslationInterface>();
75         registry
76             .addDialectInterface<LLVM::LLVMAVX512Dialect,
77                                  LLVMAVX512DialectLLVMIRTranslationInterface>();
78         registry.addDialectInterface<
79             LLVM::LLVMArmNeonDialect,
80             LLVMArmNeonDialectLLVMIRTranslationInterface>();
81         registry
82             .addDialectInterface<LLVM::LLVMArmSVEDialect,
83                                  LLVMArmSVEDialectLLVMIRTranslationInterface>();
84         registry.addDialectInterface<NVVM::NVVMDialect,
85                                      NVVMDialectLLVMIRTranslationInterface>();
86         registry.addDialectInterface<ROCDL::ROCDLDialect,
87                                      ROCDLDialectLLVMIRTranslationInterface>();
88         registerLLVMDialectTranslation(registry);
89       });
90 }
91 } // namespace mlir
92