blob: 5b7df69b62e0b0c576e1203520b8e7aac44beee9 [file] [log] [blame]
//===- BasicPtxBuilderInterface.td - PTX builder interface -*- tablegen -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// Defines the interface to build PTX (Parallel Thread Execution) from NVVM Ops
// automatically. It is used by NVVM to LLVM pass.
//
//===----------------------------------------------------------------------===//
#ifndef NVVM_DIALECT_NVVM_IR_BASICPTXBUILDERINTERFACE_H_
#define NVVM_DIALECT_NVVM_IR_BASICPTXBUILDERINTERFACE_H_
#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
#include "mlir/IR/BuiltinAttributes.h"
#include "mlir/IR/PatternMatch.h"
#include "mlir/IR/Value.h"
namespace mlir {
namespace NVVM {
/// Register read/write modifier to build constraint string for PTX inline
/// https://docs.nvidia.com/cuda/inline-ptx-assembly/index.html#parameters
enum class PTXRegisterMod {
/// Read register with no modifier
Read = 0,
/// Read register with '+' modifier
Write = 2,
/// Read register with '=' modifier.
/// Note that, this is not natively supported by LLVM, but it is possible to
/// set read and write for the same operand.
ReadWrite = 1,
};
} // namespace NVVM
} // namespace mlir
/// Include the generated interface declarations.
#include "mlir/Dialect/LLVMIR/BasicPtxBuilderInterface.h.inc"
namespace mlir {
namespace NVVM {
/// A class to build PTX assembly automatically. It is used by
/// BasicPtxBuilderInterface.
class PtxBuilder {
// The interface op that is used to build the PTX.
BasicPtxBuilderInterface interfaceOp;
// Rewriter to create new operations.
PatternRewriter &rewriter;
// The operands for the PTX instruction
SmallVector<Value> ptxOperands;
// Register constraints (read, write, readwrite) and register data types
std::string registerConstraints;
bool hasResult = false;
public:
/// Single constructor that only initializes members.
PtxBuilder(Operation *op, PatternRewriter &rewriter)
: interfaceOp(op), rewriter(rewriter) {}
/// Add an operand with the read/write input type.
void insertValue(Value v, PTXRegisterMod itype = PTXRegisterMod::Read);
/// Builds the inline assembly Op and returns it. The `insertValue` needs to
/// be called to pass operands before building the PTX.
LLVM::InlineAsmOp build();
/// Shortcut to build the inline assembly Op and replace or erase the original
/// op with
void buildAndReplaceOp();
};
} // namespace NVVM
} // namespace mlir
#endif // NVVM_DIALECT_NVVM_IR_BASICPTXBUILDERINTERFACE_H_