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 ®istry) { 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 ®istry) { 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