blob: 9435d25332f3028111fd6d46f9862e3ff4b735ec [file] [log] [blame]
Chris Lattner158e0a3e2018-07-08 20:51:38 -07001//===- Builders.h - Helpers for constructing MLIR Classes -------*- C++ -*-===//
2//
3// Copyright 2019 The MLIR Authors.
4//
5// Licensed under the Apache License, Version 2.0 (the "License");
6// you may not use this file except in compliance with the License.
7// You may obtain a copy of the License at
8//
9// http://www.apache.org/licenses/LICENSE-2.0
10//
11// Unless required by applicable law or agreed to in writing, software
12// distributed under the License is distributed on an "AS IS" BASIS,
13// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14// See the License for the specific language governing permissions and
15// limitations under the License.
16// =============================================================================
17
18#ifndef MLIR_IR_BUILDERS_H
19#define MLIR_IR_BUILDERS_H
20
21#include "mlir/IR/CFGFunction.h"
Tatiana Shpeisman565b9642018-07-16 11:47:09 -070022#include "mlir/IR/MLFunction.h"
23#include "mlir/IR/Statements.h"
Chris Lattner158e0a3e2018-07-08 20:51:38 -070024
25namespace mlir {
26class MLIRContext;
27class Module;
28class Type;
29class PrimitiveType;
30class IntegerType;
31class FunctionType;
32class VectorType;
33class RankedTensorType;
34class UnrankedTensorType;
Chris Lattner1ac20cb2018-07-10 10:59:53 -070035class BoolAttr;
36class IntegerAttr;
37class FloatAttr;
38class StringAttr;
39class ArrayAttr;
40class AffineMap;
41class AffineExpr;
42class AffineConstantExpr;
43class AffineDimExpr;
44class AffineSymbolExpr;
Chris Lattner158e0a3e2018-07-08 20:51:38 -070045
46/// This class is a general helper class for creating context-global objects
47/// like types, attributes, and affine expressions.
48class Builder {
49public:
50 explicit Builder(MLIRContext *context) : context(context) {}
51 explicit Builder(Module *module);
52
53 MLIRContext *getContext() const { return context; }
54
Chris Lattner1ac20cb2018-07-10 10:59:53 -070055 Identifier getIdentifier(StringRef str);
56 Module *createModule();
57
Chris Lattner158e0a3e2018-07-08 20:51:38 -070058 // Types.
59 PrimitiveType *getAffineIntType();
60 PrimitiveType *getBF16Type();
61 PrimitiveType *getF16Type();
62 PrimitiveType *getF32Type();
63 PrimitiveType *getF64Type();
64 IntegerType *getIntegerType(unsigned width);
65 FunctionType *getFunctionType(ArrayRef<Type *> inputs,
66 ArrayRef<Type *> results);
67 VectorType *getVectorType(ArrayRef<unsigned> shape, Type *elementType);
68 RankedTensorType *getTensorType(ArrayRef<int> shape, Type *elementType);
69 UnrankedTensorType *getTensorType(Type *elementType);
70
Chris Lattner1ac20cb2018-07-10 10:59:53 -070071 // Attributes.
72 BoolAttr *getBoolAttr(bool value);
73 IntegerAttr *getIntegerAttr(int64_t value);
74 FloatAttr *getFloatAttr(double value);
75 StringAttr *getStringAttr(StringRef bytes);
76 ArrayAttr *getArrayAttr(ArrayRef<Attribute *> value);
77
78 // Affine Expressions and Affine Map.
79 AffineMap *getAffineMap(unsigned dimCount, unsigned symbolCount,
Uday Bondhugula0115dbb2018-07-11 21:31:07 -070080 ArrayRef<AffineExpr *> results,
81 ArrayRef<AffineExpr *> rangeSizes);
Chris Lattner1ac20cb2018-07-10 10:59:53 -070082 AffineDimExpr *getDimExpr(unsigned position);
83 AffineSymbolExpr *getSymbolExpr(unsigned position);
84 AffineConstantExpr *getConstantExpr(int64_t constant);
85 AffineExpr *getAddExpr(AffineExpr *lhs, AffineExpr *rhs);
86 AffineExpr *getSubExpr(AffineExpr *lhs, AffineExpr *rhs);
87 AffineExpr *getMulExpr(AffineExpr *lhs, AffineExpr *rhs);
88 AffineExpr *getModExpr(AffineExpr *lhs, AffineExpr *rhs);
89 AffineExpr *getFloorDivExpr(AffineExpr *lhs, AffineExpr *rhs);
90 AffineExpr *getCeilDivExpr(AffineExpr *lhs, AffineExpr *rhs);
91
Chris Lattner158e0a3e2018-07-08 20:51:38 -070092 // TODO: Helpers for affine map/exprs, etc.
Chris Lattner158e0a3e2018-07-08 20:51:38 -070093protected:
94 MLIRContext *context;
95};
96
97/// This class helps build a CFGFunction. Instructions that are created are
98/// automatically inserted at an insertion point or added to the current basic
99/// block.
100class CFGFuncBuilder : public Builder {
101public:
102 CFGFuncBuilder(BasicBlock *block)
103 : Builder(block->getFunction()->getContext()),
104 function(block->getFunction()) {
105 setInsertionPoint(block);
106 }
107 CFGFuncBuilder(CFGFunction *function)
108 : Builder(function->getContext()), function(function) {}
109
110 /// Reset the insertion point to no location. Creating an operation without a
111 /// set insertion point is an error, but this can still be useful when the
112 /// current insertion point a builder refers to is being removed.
113 void clearInsertionPoint() {
114 this->block = nullptr;
115 insertPoint = BasicBlock::iterator();
116 }
117
118 /// Set the insertion point to the end of the specified block.
119 void setInsertionPoint(BasicBlock *block) {
120 this->block = block;
121 insertPoint = block->end();
122 }
123
124 OperationInst *createOperation(Identifier name,
125 ArrayRef<NamedAttribute> attributes) {
126 auto op = new OperationInst(name, attributes, context);
127 block->getOperations().push_back(op);
128 return op;
129 }
130
131 // Terminators.
132
133 ReturnInst *createReturnInst() { return insertTerminator(new ReturnInst()); }
134
135 BranchInst *createBranchInst(BasicBlock *dest) {
136 return insertTerminator(new BranchInst(dest));
137 }
138
139private:
140 template <typename T>
141 T *insertTerminator(T *term) {
142 block->setTerminator(term);
143 return term;
144 }
145
146 CFGFunction *function;
147 BasicBlock *block = nullptr;
148 BasicBlock::iterator insertPoint;
149};
150
Tatiana Shpeisman565b9642018-07-16 11:47:09 -0700151/// This class helps build an MLFunction. Statements that are created are
152/// automatically inserted at an insertion point or added to the current
153/// statement block.
154class MLFuncBuilder : public Builder {
155public:
156 MLFuncBuilder(MLFunction *function) : Builder(function->getContext()) {}
157
158 MLFuncBuilder(StmtBlock *block) : MLFuncBuilder(block->getFunction()) {
159 setInsertionPoint(block);
160 }
161
162 /// Reset the insertion point to no location. Creating an operation without a
163 /// set insertion point is an error, but this can still be useful when the
164 /// current insertion point a builder refers to is being removed.
165 void clearInsertionPoint() {
166 this->block = nullptr;
167 insertPoint = StmtBlock::iterator();
168 }
169
170 /// Set the insertion point to the end of the specified block.
171 void setInsertionPoint(StmtBlock *block) {
172 this->block = block;
173 insertPoint = block->end();
174 }
175
176 OperationStmt *createOperation(Identifier name,
177 ArrayRef<NamedAttribute> attributes) {
178 auto op = new OperationStmt(name, attributes, context);
179 block->getStatements().push_back(op);
180 return op;
181 }
182
183 ForStmt *createFor() {
184 auto stmt = new ForStmt();
185 block->getStatements().push_back(stmt);
186 return stmt;
187 }
188
189 IfStmt *createIf() {
190 auto stmt = new IfStmt();
191 block->getStatements().push_back(stmt);
192 return stmt;
193 }
194
195private:
196 StmtBlock *block = nullptr;
197 StmtBlock::iterator insertPoint;
198};
Chris Lattner158e0a3e2018-07-08 20:51:38 -0700199
200} // namespace mlir
201
202#endif