13 #ifndef MLIR_IR_AFFINEEXPRVISITOR_H
14 #define MLIR_IR_AFFINEEXPRVISITOR_H
18 #include "llvm/ADT/ArrayRef.h"
69 template <
typename SubClass,
typename RetTy>
74 static_assert(std::is_base_of<AffineExprVisitorBase, SubClass>::value,
75 "Must instantiate with a derived type of AffineExprVisitor");
76 auto self =
static_cast<SubClass *
>(
this);
79 auto binOpExpr = cast<AffineBinaryOpExpr>(expr);
80 return self->visitAddExpr(binOpExpr);
83 auto binOpExpr = cast<AffineBinaryOpExpr>(expr);
84 return self->visitMulExpr(binOpExpr);
87 auto binOpExpr = cast<AffineBinaryOpExpr>(expr);
88 return self->visitModExpr(binOpExpr);
91 auto binOpExpr = cast<AffineBinaryOpExpr>(expr);
92 return self->visitFloorDivExpr(binOpExpr);
95 auto binOpExpr = cast<AffineBinaryOpExpr>(expr);
96 return self->visitCeilDivExpr(binOpExpr);
99 return self->visitConstantExpr(cast<AffineConstantExpr>(expr));
101 return self->visitDimExpr(cast<AffineDimExpr>(expr));
103 return self->visitSymbolExpr(cast<AffineSymbolExpr>(expr));
105 llvm_unreachable(
"Unknown AffineExpr");
139 template <
typename SubClass,
typename RetTy =
void>
147 static_assert(std::is_base_of<AffineExprVisitor, SubClass>::value,
148 "Must instantiate with a derived type of AffineExprVisitor");
149 auto self =
static_cast<SubClass *
>(
this);
152 auto binOpExpr = cast<AffineBinaryOpExpr>(expr);
153 walkOperandsPostOrder(binOpExpr);
154 return self->visitAddExpr(binOpExpr);
157 auto binOpExpr = cast<AffineBinaryOpExpr>(expr);
158 walkOperandsPostOrder(binOpExpr);
159 return self->visitMulExpr(binOpExpr);
162 auto binOpExpr = cast<AffineBinaryOpExpr>(expr);
163 walkOperandsPostOrder(binOpExpr);
164 return self->visitModExpr(binOpExpr);
167 auto binOpExpr = cast<AffineBinaryOpExpr>(expr);
168 walkOperandsPostOrder(binOpExpr);
169 return self->visitFloorDivExpr(binOpExpr);
172 auto binOpExpr = cast<AffineBinaryOpExpr>(expr);
173 walkOperandsPostOrder(binOpExpr);
174 return self->visitCeilDivExpr(binOpExpr);
177 return self->visitConstantExpr(cast<AffineConstantExpr>(expr));
179 return self->visitDimExpr(cast<AffineDimExpr>(expr));
181 return self->visitSymbolExpr(cast<AffineSymbolExpr>(expr));
183 llvm_unreachable(
"Unknown AffineExpr");
194 template <
typename SubClass>
203 static_assert(std::is_base_of<AffineExprVisitor, SubClass>::value,
204 "Must instantiate with a derived type of AffineExprVisitor");
205 auto self =
static_cast<SubClass *
>(
this);
208 auto binOpExpr = cast<AffineBinaryOpExpr>(expr);
209 if (
failed(walkOperandsPostOrder(binOpExpr)))
211 return self->visitAddExpr(binOpExpr);
214 auto binOpExpr = cast<AffineBinaryOpExpr>(expr);
215 if (
failed(walkOperandsPostOrder(binOpExpr)))
217 return self->visitMulExpr(binOpExpr);
220 auto binOpExpr = cast<AffineBinaryOpExpr>(expr);
221 if (
failed(walkOperandsPostOrder(binOpExpr)))
223 return self->visitModExpr(binOpExpr);
226 auto binOpExpr = cast<AffineBinaryOpExpr>(expr);
227 if (
failed(walkOperandsPostOrder(binOpExpr)))
229 return self->visitFloorDivExpr(binOpExpr);
232 auto binOpExpr = cast<AffineBinaryOpExpr>(expr);
233 if (
failed(walkOperandsPostOrder(binOpExpr)))
235 return self->visitCeilDivExpr(binOpExpr);
238 return self->visitConstantExpr(cast<AffineConstantExpr>(expr));
240 return self->visitDimExpr(cast<AffineDimExpr>(expr));
242 return self->visitSymbolExpr(cast<AffineSymbolExpr>(expr));
244 llvm_unreachable(
"Unknown AffineExpr");
385 void addLocalVariableSemiAffine(
AffineExpr expr,
387 unsigned long resultSize);
401 inline unsigned getNumCols()
const {
404 inline unsigned getConstantIndex()
const {
return getNumCols() - 1; }
406 inline unsigned getSymbolStartIndex()
const {
return numDims; }
407 inline unsigned getDimStartIndex()
const {
return 0; }
Affine binary operation expression.
AffineExpr getLHS() const
AffineExpr getRHS() const
An integer constant appearing in affine expression.
A dimensional identifier appearing in an affine expression.
Base class for AffineExpr visitors/walkers.
RetTy visitAddExpr(AffineBinaryOpExpr expr)
RetTy visitDimExpr(AffineDimExpr expr)
RetTy visitFloorDivExpr(AffineBinaryOpExpr expr)
RetTy visit(AffineExpr expr)
RetTy visitSymbolExpr(AffineSymbolExpr expr)
RetTy visitAffineBinaryOpExpr(AffineBinaryOpExpr expr)
RetTy visitModExpr(AffineBinaryOpExpr expr)
RetTy visitConstantExpr(AffineConstantExpr expr)
RetTy visitMulExpr(AffineBinaryOpExpr expr)
RetTy visitCeilDivExpr(AffineBinaryOpExpr expr)
LogicalResult walkPostOrder(AffineExpr expr)
RetTy walkPostOrder(AffineExpr expr)
Base type for affine expression.
AffineExprKind getKind() const
Return the classification for this type.
A symbolic identifier appearing in an affine expression.
virtual void addLocalFloorDivId(ArrayRef< int64_t > dividend, int64_t divisor, AffineExpr localExpr)
LogicalResult visitSymbolExpr(AffineSymbolExpr expr)
std::vector< SmallVector< int64_t, 8 > > operandExprStack
LogicalResult visitDimExpr(AffineDimExpr expr)
LogicalResult visitFloorDivExpr(AffineBinaryOpExpr expr)
LogicalResult visitConstantExpr(AffineConstantExpr expr)
LogicalResult visitModExpr(AffineBinaryOpExpr expr)
LogicalResult visitAddExpr(AffineBinaryOpExpr expr)
virtual ~SimpleAffineExprFlattener()=default
LogicalResult visitCeilDivExpr(AffineBinaryOpExpr expr)
LogicalResult visitMulExpr(AffineBinaryOpExpr expr)
virtual void addLocalIdSemiAffine(AffineExpr localExpr)
Add a local identifier (needed to flatten a mod, floordiv, ceildiv, mul expr) when the rhs is a symbo...
SmallVector< AffineExpr, 4 > localExprs
SimpleAffineExprFlattener(unsigned numDims, unsigned numSymbols)
Include the generated interface declarations.
LogicalResult failure(bool isFailure=true)
Utility function to generate a LogicalResult.
LogicalResult success(bool isSuccess=true)
Utility function to generate a LogicalResult.
@ CeilDiv
RHS of ceildiv is always a constant or a symbolic expression.
@ Mul
RHS of mul is always a constant or a symbolic expression.
@ Mod
RHS of mod is always a constant or a symbolic expression with a positive value.
@ DimId
Dimensional identifier.
@ FloorDiv
RHS of floordiv is always a constant or a symbolic expression.
@ Constant
Constant integer.
@ SymbolId
Symbolic identifier.
bool failed(LogicalResult result)
Utility function that returns true if the provided LogicalResult corresponds to a failure value.
This class represents an efficient way to signal success or failure.