Halide  20.0.0
Halide compiler and libraries
IRPrinter.h
Go to the documentation of this file.
1 #ifndef HALIDE_IR_PRINTER_H
2 #define HALIDE_IR_PRINTER_H
3 
4 /** \file
5  * This header file defines operators that let you dump a Halide
6  * expression, statement, or type directly into an output stream
7  * in a human readable form.
8  * E.g:
9  \code
10  Expr foo = ...
11  std::cout << "Foo is " << foo << "\n";
12  \endcode
13  *
14  * These operators are implemented using \ref Halide::Internal::IRPrinter
15  */
16 
17 #include <ostream>
18 
19 #include "IRVisitor.h"
20 #include "Module.h"
21 #include "Scope.h"
22 
23 namespace Halide {
24 
25 /** Emit an expression on an output stream (such as std::cout) in
26  * human-readable form */
27 std::ostream &operator<<(std::ostream &stream, const Expr &);
28 
29 /** Emit a halide type on an output stream (such as std::cout) in
30  * human-readable form */
31 std::ostream &operator<<(std::ostream &stream, const Type &);
32 
33 /** Emit a halide Module on an output stream (such as std::cout) in
34  * human-readable form */
35 std::ostream &operator<<(std::ostream &stream, const Module &);
36 
37 /** Emit a halide device api type in human-readable form */
38 std::ostream &operator<<(std::ostream &stream, const DeviceAPI &);
39 
40 /** Emit a halide memory type in human-readable form */
41 std::ostream &operator<<(std::ostream &stream, const MemoryType &);
42 
43 /** Emit a halide tail strategy in human-readable form */
44 std::ostream &operator<<(std::ostream &stream, const TailStrategy &);
45 
46 /** Emit a halide loop partitioning policy in human-readable form */
47 std::ostream &operator<<(std::ostream &stream, const Partition &);
48 
49 /** Emit a halide LoopLevel in human-readable form */
50 std::ostream &operator<<(std::ostream &stream, const LoopLevel &);
51 
52 struct Target;
53 /** Emit a halide Target in a human readable form */
54 std::ostream &operator<<(std::ostream &stream, const Target &);
55 
56 namespace Internal {
57 
58 struct AssociativePattern;
59 struct AssociativeOp;
60 class Closure;
61 struct Interval;
62 struct ConstantInterval;
63 struct ModulusRemainder;
64 enum class IRNodeType;
65 
66 /** Emit a halide node type on an output stream (such as std::cout) in
67  * human-readable form */
68 std::ostream &operator<<(std::ostream &stream, IRNodeType);
69 
70 /** Emit a halide associative pattern on an output stream (such as std::cout)
71  * in a human-readable form */
72 std::ostream &operator<<(std::ostream &stream, const AssociativePattern &);
73 
74 /** Emit a halide associative op on an output stream (such as std::cout) in a
75  * human-readable form */
76 std::ostream &operator<<(std::ostream &stream, const AssociativeOp &);
77 
78 /** Emit a halide statement on an output stream (such as std::cout) in
79  * a human-readable form */
80 std::ostream &operator<<(std::ostream &stream, const Stmt &);
81 
82 /** Emit a halide for loop type (vectorized, serial, etc) in a human
83  * readable form */
84 std::ostream &operator<<(std::ostream &stream, const ForType &);
85 
86 /** Emit a horizontal vector reduction op in human-readable form. */
87 std::ostream &operator<<(std::ostream &stream, const VectorReduce::Operator &);
88 
89 /** Emit a halide name mangling value in a human readable format */
90 std::ostream &operator<<(std::ostream &stream, const NameMangling &);
91 
92 /** Emit a halide LoweredFunc in a human readable format */
93 std::ostream &operator<<(std::ostream &stream, const LoweredFunc &);
94 
95 /** Emit a halide linkage value in a human readable format */
96 std::ostream &operator<<(std::ostream &stream, const LinkageType &);
97 
98 /** Emit a halide dimension type in human-readable format */
99 std::ostream &operator<<(std::ostream &stream, const DimType &);
100 
101 /** Emit a Closure in human-readable form */
102 std::ostream &operator<<(std::ostream &out, const Closure &c);
103 
104 /** Emit an Interval in human-readable form */
105 std::ostream &operator<<(std::ostream &out, const Interval &c);
106 
107 /** Emit a ConstantInterval in human-readable form */
108 std::ostream &operator<<(std::ostream &out, const ConstantInterval &c);
109 
110 /** Emit a ModulusRemainder in human-readable form */
111 std::ostream &operator<<(std::ostream &out, const ModulusRemainder &c);
112 
113 struct Indentation {
114  int indent;
115 };
116 std::ostream &operator<<(std::ostream &stream, const Indentation &);
117 
118 /** An IRVisitor that emits IR to the given output stream in a human
119  * readable form. Can be subclassed if you want to modify the way in
120  * which it prints.
121  */
122 class IRPrinter : public IRVisitor {
123 public:
124  /** Construct an IRPrinter pointed at a given output stream
125  * (e.g. std::cout, or a std::ofstream) */
126  explicit IRPrinter(std::ostream &);
127 
128  /** emit an expression on the output stream */
129  void print(const Expr &);
130 
131  /** Emit an expression on the output stream without enclosing parens */
132  void print_no_parens(const Expr &);
133 
134  /** emit a statement on the output stream */
135  void print(const Stmt &);
136 
137  /** emit a statement summary on the output stream */
138  void print_summary(const Stmt &);
139 
140  /** emit a comma delimited list of exprs, without any leading or
141  * trailing punctuation. */
142  void print_list(const std::vector<Expr> &exprs);
143 
144  static void test();
145 
146 protected:
148  return Indentation{indent};
149  }
150 
151  /** The stream on which we're outputting */
152  std::ostream &stream;
153 
154  /** The current indentation level, useful for pretty-printing
155  * statements */
156  int indent = 0;
157 
158  /** Certain expressions do not need parens around them, e.g. the
159  * args to a call are already separated by commas and a
160  * surrounding set of parens. */
161  bool implicit_parens = false;
162 
163  /** Print only a summary of a statement, with sub-statements replaced by
164  * ellipses (...). */
165  bool is_summary = false;
166 
167  /** Either emits "(" or "", depending on the value of implicit_parens */
168  void open();
169 
170  /** Either emits ")" or "", depending on the value of implicit_parens */
171  void close();
172 
173  /** The symbols whose types can be inferred from values printed
174  * already. */
176 
177  /** A helper for printing a chain of lets with line breaks */
178  void print_lets(const Let *let);
179 
180  /** A helper for printing a braced statement */
181  void print_braced_stmt(const Stmt &, int extra_indent = 2);
182 
183  void visit(const IntImm *) override;
184  void visit(const UIntImm *) override;
185  void visit(const FloatImm *) override;
186  void visit(const StringImm *) override;
187  void visit(const Cast *) override;
188  void visit(const Reinterpret *) override;
189  void visit(const Variable *) override;
190  void visit(const Add *) override;
191  void visit(const Sub *) override;
192  void visit(const Mul *) override;
193  void visit(const Div *) override;
194  void visit(const Mod *) override;
195  void visit(const Min *) override;
196  void visit(const Max *) override;
197  void visit(const EQ *) override;
198  void visit(const NE *) override;
199  void visit(const LT *) override;
200  void visit(const LE *) override;
201  void visit(const GT *) override;
202  void visit(const GE *) override;
203  void visit(const And *) override;
204  void visit(const Or *) override;
205  void visit(const Not *) override;
206  void visit(const Select *) override;
207  void visit(const Load *) override;
208  void visit(const Ramp *) override;
209  void visit(const Broadcast *) override;
210  void visit(const Call *) override;
211  void visit(const Let *) override;
212  void visit(const LetStmt *) override;
213  void visit(const AssertStmt *) override;
214  void visit(const ProducerConsumer *) override;
215  void visit(const For *) override;
216  void visit(const Acquire *) override;
217  void visit(const Store *) override;
218  void visit(const Provide *) override;
219  void visit(const Allocate *) override;
220  void visit(const Free *) override;
221  void visit(const Realize *) override;
222  void visit(const Block *) override;
223  void visit(const Fork *) override;
224  void visit(const IfThenElse *) override;
225  void visit(const Evaluate *) override;
226  void visit(const Shuffle *) override;
227  void visit(const VectorReduce *) override;
228  void visit(const Prefetch *) override;
229  void visit(const Atomic *) override;
230  void visit(const HoistedStorage *) override;
231 };
232 
233 /** Debugging helpers for LLDB */
234 /// @{
235 std::string lldb_string(const Expr &);
236 std::string lldb_string(const Internal::BaseExprNode *);
237 std::string lldb_string(const Stmt &);
238 /// @}
239 
240 } // namespace Internal
241 } // namespace Halide
242 
243 #endif
Defines the base class for things that recursively walk over the IR.
Defines Module, an IR container that fully describes a Halide program.
Defines the Scope class, which is used for keeping track of names in a scope while traversing IR.
A helper class to manage closures.
Definition: Closure.h:26
An IRVisitor that emits IR to the given output stream in a human readable form.
Definition: IRPrinter.h:122
void visit(const EQ *) override
void visit(const Sub *) override
void visit(const Provide *) override
void visit(const And *) override
Scope known_type
The symbols whose types can be inferred from values printed already.
Definition: IRPrinter.h:175
void visit(const GE *) override
void visit(const Div *) override
void visit(const Free *) override
void visit(const Or *) override
int indent
The current indentation level, useful for pretty-printing statements.
Definition: IRPrinter.h:156
void print(const Expr &)
emit an expression on the output stream
void visit(const Load *) override
void visit(const UIntImm *) override
void print_no_parens(const Expr &)
Emit an expression on the output stream without enclosing parens.
void print_lets(const Let *let)
A helper for printing a chain of lets with line breaks.
void visit(const Variable *) override
void visit(const Max *) override
void visit(const Block *) override
void visit(const Reinterpret *) override
void visit(const Add *) override
void visit(const Ramp *) override
void print_list(const std::vector< Expr > &exprs)
emit a comma delimited list of exprs, without any leading or trailing punctuation.
void visit(const Acquire *) override
void visit(const AssertStmt *) override
Indentation get_indent() const
Definition: IRPrinter.h:147
void visit(const Mul *) override
void print_summary(const Stmt &)
emit a statement summary on the output stream
void visit(const Prefetch *) override
void visit(const Atomic *) override
bool implicit_parens
Certain expressions do not need parens around them, e.g.
Definition: IRPrinter.h:161
void visit(const Cast *) override
void visit(const VectorReduce *) override
void visit(const LetStmt *) override
void visit(const StringImm *) override
void visit(const Realize *) override
void visit(const LE *) override
void visit(const Broadcast *) override
void visit(const Evaluate *) override
std::ostream & stream
The stream on which we're outputting.
Definition: IRPrinter.h:152
void visit(const Select *) override
void visit(const FloatImm *) override
bool is_summary
Print only a summary of a statement, with sub-statements replaced by ellipses (......
Definition: IRPrinter.h:165
void visit(const IntImm *) override
IRPrinter(std::ostream &)
Construct an IRPrinter pointed at a given output stream (e.g.
void visit(const LT *) override
void visit(const For *) override
void visit(const Store *) override
void visit(const Mod *) override
void print_braced_stmt(const Stmt &, int extra_indent=2)
A helper for printing a braced statement.
void close()
Either emits ")" or "", depending on the value of implicit_parens.
void visit(const ProducerConsumer *) override
void visit(const HoistedStorage *) override
void visit(const Shuffle *) override
void visit(const Not *) override
void visit(const GT *) override
void visit(const NE *) override
void print(const Stmt &)
emit a statement on the output stream
void visit(const Min *) override
void open()
Either emits "(" or "", depending on the value of implicit_parens.
void visit(const IfThenElse *) override
void visit(const Call *) override
void visit(const Fork *) override
void visit(const Allocate *) override
void visit(const Let *) override
A base class for algorithms that need to recursively walk over the IR.
Definition: IRVisitor.h:19
A common pattern when traversing Halide IR is that you need to keep track of stuff when you find a Le...
Definition: Scope.h:94
A reference to a site in a Halide statement at the top of the body of a particular for loop.
Definition: Schedule.h:203
DimType
Each Dim below has a dim_type, which tells you what transformations are legal on it.
Definition: Schedule.h:357
ForType
An enum describing a type of loop traversal.
Definition: Expr.h:406
std::string lldb_string(const Expr &)
Debugging helpers for LLDB.
ConstantInterval operator<<(const ConstantInterval &a, const ConstantInterval &b)
IRNodeType
All our IR node types get unique IDs for the purposes of RTTI.
Definition: Expr.h:25
This file defines the class FunctionDAG, which is our representation of a Halide pipeline,...
LinkageType
Type of linkage a function in a lowered Halide module can have.
Definition: Module.h:52
@ Internal
Not visible externally, similar to 'static' linkage in C.
TailStrategy
Different ways to handle a tail case in a split when the factor does not provably divide the extent.
Definition: Schedule.h:33
std::ostream & operator<<(std::ostream &stream, const Expr &)
Emit an expression on an output stream (such as std::cout) in human-readable form.
NameMangling
An enum to specify calling convention for extern stages.
Definition: Function.h:26
DeviceAPI
An enum describing a type of device API.
Definition: DeviceAPI.h:15
MemoryType
An enum describing different address spaces to be used with Func::store_in.
Definition: Expr.h:353
Partition
Different ways to handle loops with a potentially optimizable boundary conditions.
A fragment of Halide syntax.
Definition: Expr.h:258
The sum of two expressions.
Definition: IR.h:56
Allocate a scratch area called with the given name, type, and size.
Definition: IR.h:371
Logical and - are both expressions true.
Definition: IR.h:175
If the 'condition' is false, then evaluate and return the message, which should be a call to an error...
Definition: IR.h:294
Represent the equivalent associative op of an update definition.
Definition: Associativity.h:61
Represent an associative op with its identity.
Lock all the Store nodes in the body statement.
Definition: IR.h:961
A base class for expression nodes.
Definition: Expr.h:143
A sequence of statements to be executed in-order.
Definition: IR.h:442
A vector with 'lanes' elements, in which every element is 'value'.
Definition: IR.h:259
A function call.
Definition: IR.h:490
The actual IR nodes begin here.
Definition: IR.h:30
A class to represent ranges of integers.
The ratio of two expressions.
Definition: IR.h:83
Is the first expression equal to the second.
Definition: IR.h:121
Evaluate and discard an expression, presumably because it has some side-effect.
Definition: IR.h:476
Floating point constants.
Definition: Expr.h:236
A for loop.
Definition: IR.h:819
A pair of statements executed concurrently.
Definition: IR.h:457
Free the resources associated with the given buffer.
Definition: IR.h:413
Is the first expression greater than or equal to the second.
Definition: IR.h:166
Is the first expression greater than the second.
Definition: IR.h:157
Represents a location where storage will be hoisted to for a Func / Realize node with a given name.
Definition: IR.h:945
An if-then-else block.
Definition: IR.h:466
Integer constants.
Definition: Expr.h:218
A class to represent ranges of Exprs.
Definition: Interval.h:14
Is the first expression less than or equal to the second.
Definition: IR.h:148
Is the first expression less than the second.
Definition: IR.h:139
A let expression, like you might find in a functional language.
Definition: IR.h:271
The statement form of a let node.
Definition: IR.h:282
Load a value from a named symbol if predicate is true.
Definition: IR.h:217
Definition of a lowered function.
Definition: Module.h:101
The greater of two values.
Definition: IR.h:112
The lesser of two values.
Definition: IR.h:103
The remainder of a / b.
Definition: IR.h:94
The result of modulus_remainder analysis.
The product of two expressions.
Definition: IR.h:74
Is the first expression not equal to the second.
Definition: IR.h:130
Logical not - true if the expression false.
Definition: IR.h:193
Logical or - is at least one of the expression true.
Definition: IR.h:184
Represent a multi-dimensional region of a Func or an ImageParam that needs to be prefetched.
Definition: IR.h:923
This node is a helpful annotation to do with permissions.
Definition: IR.h:315
This defines the value of a function at a multi-dimensional location.
Definition: IR.h:354
A linear ramp vector node.
Definition: IR.h:247
Allocate a multi-dimensional buffer of the given type and size.
Definition: IR.h:427
Reinterpret value as another type, without affecting any of the bits (on little-endian systems).
Definition: IR.h:47
A ternary operator.
Definition: IR.h:204
Construct a new vector by taking elements from another sequence of vectors.
Definition: IR.h:855
A reference-counted handle to a statement node.
Definition: Expr.h:427
Store a 'value' to the buffer called 'name' at a given 'index' if 'predicate' is true.
Definition: IR.h:333
String constants.
Definition: Expr.h:245
The difference of two expressions.
Definition: IR.h:65
Unsigned integer constants.
Definition: Expr.h:227
A named variable.
Definition: IR.h:772
Horizontally reduce a vector to a scalar or narrower vector using the given commutative and associati...
Definition: IR.h:979
A struct representing a target machine and os to generate code for.
Definition: Target.h:19