121 lines · cpp
1//===- NVVMToLLVM.cpp - NVVM to LLVM dialect 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-exception6//7//===----------------------------------------------------------------------===//8//9// This file implements a translation NVVM ops which is not supported in LLVM10// core.11//12//===----------------------------------------------------------------------===//13 14#include "mlir/Conversion/NVVMToLLVM/NVVMToLLVM.h"15 16#include "mlir/Conversion/ConvertToLLVM/ToLLVMInterface.h"17#include "mlir/Conversion/LLVMCommon/Pattern.h"18#include "mlir/Dialect/Func/IR/FuncOps.h"19#include "mlir/Dialect/LLVMIR/LLVMDialect.h"20#include "mlir/Dialect/LLVMIR/LLVMTypes.h"21#include "mlir/Dialect/LLVMIR/NVVMDialect.h"22#include "mlir/IR/MLIRContext.h"23#include "mlir/IR/PatternMatch.h"24#include "mlir/IR/TypeUtilities.h"25#include "mlir/IR/Value.h"26#include "mlir/Pass/Pass.h"27#include "mlir/Support/LLVM.h"28#include "llvm/Support/DebugLog.h"29#include "llvm/Support/LogicalResult.h"30#include "llvm/Support/raw_ostream.h"31 32#define DEBUG_TYPE "nvvm-to-llvm"33 34namespace mlir {35#define GEN_PASS_DEF_CONVERTNVVMTOLLVMPASS36#include "mlir/Conversion/Passes.h.inc"37} // namespace mlir38 39using namespace mlir;40using namespace NVVM;41 42namespace {43 44struct PtxLowering45 : public OpInterfaceRewritePattern<BasicPtxBuilderInterface> {46 using OpInterfaceRewritePattern<47 BasicPtxBuilderInterface>::OpInterfaceRewritePattern;48 49 PtxLowering(MLIRContext *context, PatternBenefit benefit = 2)50 : OpInterfaceRewritePattern(context, benefit) {}51 52 LogicalResult matchAndRewrite(BasicPtxBuilderInterface op,53 PatternRewriter &rewriter) const override {54 if (op.hasIntrinsic()) {55 LDBG() << "Ptx Builder does not lower \n\t" << op;56 return failure();57 }58 59 SmallVector<std::pair<Value, PTXRegisterMod>> asmValues;60 LDBG() << op.getPtx();61 62 bool needsManualMapping = op.getAsmValues(rewriter, asmValues);63 PtxBuilder generator(op, rewriter, needsManualMapping);64 for (auto &[asmValue, modifier] : asmValues) {65 LDBG() << asmValue << "\t Modifier : " << modifier;66 if (failed(generator.insertValue(asmValue, modifier)))67 return failure();68 }69 70 generator.buildAndReplaceOp();71 return success();72 }73};74 75struct ConvertNVVMToLLVMPass76 : public impl::ConvertNVVMToLLVMPassBase<ConvertNVVMToLLVMPass> {77 using Base::Base;78 79 void getDependentDialects(DialectRegistry ®istry) const override {80 registry.insert<LLVM::LLVMDialect, NVVM::NVVMDialect>();81 }82 83 void runOnOperation() override {84 ConversionTarget target(getContext());85 target.addLegalDialect<::mlir::LLVM::LLVMDialect>();86 RewritePatternSet pattern(&getContext());87 mlir::populateNVVMToLLVMConversionPatterns(pattern);88 if (failed(89 applyPartialConversion(getOperation(), target, std::move(pattern))))90 signalPassFailure();91 }92};93 94/// Implement the interface to convert NVVM to LLVM.95struct NVVMToLLVMDialectInterface : public ConvertToLLVMPatternInterface {96 using ConvertToLLVMPatternInterface::ConvertToLLVMPatternInterface;97 void loadDependentDialects(MLIRContext *context) const final {98 context->loadDialect<NVVMDialect>();99 }100 101 /// Hook for derived dialect interface to provide conversion patterns102 /// and mark dialect legal for the conversion target.103 void populateConvertToLLVMConversionPatterns(104 ConversionTarget &target, LLVMTypeConverter &typeConverter,105 RewritePatternSet &patterns) const final {106 populateNVVMToLLVMConversionPatterns(patterns);107 }108};109 110} // namespace111 112void mlir::populateNVVMToLLVMConversionPatterns(RewritePatternSet &patterns) {113 patterns.add<PtxLowering>(patterns.getContext());114}115 116void mlir::registerConvertNVVMToLLVMInterface(DialectRegistry ®istry) {117 registry.addExtension(+[](MLIRContext *ctx, NVVMDialect *dialect) {118 dialect->addInterfaces<NVVMToLLVMDialectInterface>();119 });120}121