1 //===- NVVMToLLVMIRTranslation.cpp - Translate NVVM to LLVM IR ------------===// 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 NVVM dialect and 10 // LLVM IR. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "mlir/Target/LLVMIR/Dialect/NVVM/NVVMToLLVMIRTranslation.h" 15 #include "mlir/Dialect/LLVMIR/NVVMDialect.h" 16 #include "mlir/IR/Operation.h" 17 #include "mlir/Target/LLVMIR/ModuleTranslation.h" 18 19 #include "llvm/IR/IRBuilder.h" 20 #include "llvm/IR/IntrinsicsNVPTX.h" 21 22 using namespace mlir; 23 using namespace mlir::LLVM; 24 using mlir::LLVM::detail::createIntrinsicCall; 25 26 static llvm::Intrinsic::ID getShflBflyIntrinsicId(llvm::Type *resultType, 27 bool withPredicate) { 28 if (withPredicate) { 29 resultType = cast<llvm::StructType>(resultType)->getElementType(0); 30 return resultType->isFloatTy() ? llvm::Intrinsic::nvvm_shfl_sync_bfly_f32p 31 : llvm::Intrinsic::nvvm_shfl_sync_bfly_i32p; 32 } 33 return resultType->isFloatTy() ? llvm::Intrinsic::nvvm_shfl_sync_bfly_f32 34 : llvm::Intrinsic::nvvm_shfl_sync_bfly_i32; 35 } 36 37 LogicalResult mlir::NVVMDialectLLVMIRTranslationInterface::convertOperation( 38 Operation *op, llvm::IRBuilderBase &builder, 39 LLVM::ModuleTranslation &moduleTranslation) const { 40 Operation &opInst = *op; 41 #include "mlir/Dialect/LLVMIR/NVVMConversions.inc" 42 43 return failure(); 44 } 45 46 LogicalResult mlir::NVVMDialectLLVMIRTranslationInterface::amendOperation( 47 Operation *op, NamedAttribute attribute, 48 LLVM::ModuleTranslation &moduleTranslation) const { 49 if (attribute.first == NVVM::NVVMDialect::getKernelFuncAttrName()) { 50 auto func = cast<LLVM::LLVMFuncOp>(op); 51 llvm::LLVMContext &llvmContext = moduleTranslation.getLLVMContext(); 52 llvm::Function *llvmFunc = moduleTranslation.lookupFunction(func.getName()); 53 llvm::Metadata *llvmMetadata[] = { 54 llvm::ValueAsMetadata::get(llvmFunc), 55 llvm::MDString::get(llvmContext, "kernel"), 56 llvm::ValueAsMetadata::get( 57 llvm::ConstantInt::get(llvm::Type::getInt32Ty(llvmContext), 1))}; 58 llvm::MDNode *llvmMetadataNode = 59 llvm::MDNode::get(llvmContext, llvmMetadata); 60 moduleTranslation.getOrInsertNamedModuleMetadata("nvvm.annotations") 61 ->addOperand(llvmMetadataNode); 62 } 63 return success(); 64 } 65