MLIR  20.0.0git
BasicPtxBuilderInterface.h
Go to the documentation of this file.
1 //===- BasicPtxBuilderInterface.td - PTX builder interface -*- tablegen -*-===//
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 // Defines the interface to build PTX (Parallel Thread Execution) from NVVM Ops
10 // automatically. It is used by NVVM to LLVM pass.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef NVVM_DIALECT_NVVM_IR_BASICPTXBUILDERINTERFACE_H_
15 #define NVVM_DIALECT_NVVM_IR_BASICPTXBUILDERINTERFACE_H_
16 
19 #include "mlir/IR/PatternMatch.h"
20 #include "mlir/IR/Value.h"
21 
22 namespace mlir {
23 namespace NVVM {
24 /// Register read/write modifier to build constraint string for PTX inline
25 /// https://docs.nvidia.com/cuda/inline-ptx-assembly/index.html#parameters
26 enum class PTXRegisterMod {
27  /// Read register with no modifier
28  Read = 0,
29  /// Read register with '+' modifier
30  Write = 2,
31  /// Read register with '=' modifier.
32  /// Note that, this is not natively supported by LLVM, but it is possible to
33  /// set read and write for the same operand.
34  ReadWrite = 1,
35 };
36 } // namespace NVVM
37 } // namespace mlir
38 
39 /// Include the generated interface declarations.
40 #include "mlir/Dialect/LLVMIR/BasicPtxBuilderInterface.h.inc"
41 
42 namespace mlir {
43 
44 namespace NVVM {
45 
46 /// A class to build PTX assembly automatically. It is used by
47 /// BasicPtxBuilderInterface.
48 class PtxBuilder {
49  // The interface op that is used to build the PTX.
50  BasicPtxBuilderInterface interfaceOp;
51  // Rewriter to create new operations.
52  PatternRewriter &rewriter;
53  // The operands for the PTX instruction
54  SmallVector<Value> ptxOperands;
55  // Register constraints (read, write, readwrite) and register data types
56  std::string registerConstraints;
57 
58  bool hasResult = false;
59 
60 public:
61  /// Single constructor that only initializes members.
63  : interfaceOp(op), rewriter(rewriter) {}
64 
65  /// Add an operand with the read/write input type.
67 
68  /// Builds the inline assembly Op and returns it. The `insertValue` needs to
69  /// be called to pass operands before building the PTX.
70  LLVM::InlineAsmOp build();
71 
72  /// Shortcut to build the inline assembly Op and replace or erase the original
73  /// op with
74  void buildAndReplaceOp();
75 };
76 
77 } // namespace NVVM
78 } // namespace mlir
79 
80 #endif // NVVM_DIALECT_NVVM_IR_BASICPTXBUILDERINTERFACE_H_
A class to build PTX assembly automatically.
void insertValue(Value v, PTXRegisterMod itype=PTXRegisterMod::Read)
Add an operand with the read/write input type.
PtxBuilder(Operation *op, PatternRewriter &rewriter)
Single constructor that only initializes members.
LLVM::InlineAsmOp build()
Builds the inline assembly Op and returns it.
void buildAndReplaceOp()
Shortcut to build the inline assembly Op and replace or erase the original op with.
Operation is the basic unit of execution within MLIR.
Definition: Operation.h:88
A special type of RewriterBase that coordinates the application of a rewrite pattern on the current I...
Definition: PatternMatch.h:785
This class represents an instance of an SSA value in the MLIR system, representing a computable value...
Definition: Value.h:96
PTXRegisterMod
Register read/write modifier to build constraint string for PTX inline https://docs....
@ Write
Read register with '+' modifier.
@ ReadWrite
Read register with '=' modifier.
@ Read
Read register with no modifier.
Include the generated interface declarations.