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