13 #ifndef MLIR_IR_AFFINEEXPRVISITOR_H
14 #define MLIR_IR_AFFINEEXPRVISITOR_H
17 #include "llvm/ADT/ArrayRef.h"
68 template <
typename SubClass,
typename RetTy =
void>
76 static_assert(std::is_base_of<AffineExprVisitor, SubClass>::value,
77 "Must instantiate with a derived type of AffineExprVisitor");
81 walkOperandsPostOrder(binOpExpr);
82 return static_cast<SubClass *
>(
this)->
visitAddExpr(binOpExpr);
86 walkOperandsPostOrder(binOpExpr);
87 return static_cast<SubClass *
>(
this)->
visitMulExpr(binOpExpr);
91 walkOperandsPostOrder(binOpExpr);
92 return static_cast<SubClass *
>(
this)->
visitModExpr(binOpExpr);
96 walkOperandsPostOrder(binOpExpr);
101 walkOperandsPostOrder(binOpExpr);
118 static_assert(std::is_base_of<AffineExprVisitor, SubClass>::value,
119 "Must instantiate with a derived type of AffineExprVisitor");
123 return static_cast<SubClass *
>(
this)->
visitAddExpr(binOpExpr);
127 return static_cast<SubClass *
>(
this)->
visitMulExpr(binOpExpr);
131 return static_cast<SubClass *
>(
this)->
visitModExpr(binOpExpr);
151 llvm_unreachable(
"Unknown AffineExpr");
319 void addLocalVariableSemiAffine(
AffineExpr expr,
321 unsigned long resultSize);
335 inline unsigned getNumCols()
const {
338 inline unsigned getConstantIndex()
const {
return getNumCols() - 1; }
340 inline unsigned getSymbolStartIndex()
const {
return numDims; }
341 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 visitMulExpr(AffineBinaryOpExpr expr)
RetTy visitAddExpr(AffineBinaryOpExpr expr)
RetTy visitAffineBinaryOpExpr(AffineBinaryOpExpr expr)
RetTy walkPostOrder(AffineExpr expr)
RetTy visitFloorDivExpr(AffineBinaryOpExpr expr)
RetTy visitSymbolExpr(AffineSymbolExpr expr)
RetTy visit(AffineExpr expr)
RetTy visitConstantExpr(AffineConstantExpr expr)
RetTy visitCeilDivExpr(AffineBinaryOpExpr expr)
RetTy visitModExpr(AffineBinaryOpExpr expr)
RetTy visitDimExpr(AffineDimExpr 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)
void visitFloorDivExpr(AffineBinaryOpExpr expr)
void visitAddExpr(AffineBinaryOpExpr expr)
std::vector< SmallVector< int64_t, 8 > > operandExprStack
void visitDimExpr(AffineDimExpr expr)
void visitConstantExpr(AffineConstantExpr expr)
virtual ~SimpleAffineExprFlattener()=default
void visitSymbolExpr(AffineSymbolExpr 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
void visitCeilDivExpr(AffineBinaryOpExpr expr)
void visitModExpr(AffineBinaryOpExpr expr)
SimpleAffineExprFlattener(unsigned numDims, unsigned numSymbols)
void visitMulExpr(AffineBinaryOpExpr expr)
This header declares functions that assist transformations in the MemRef dialect.
@ 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.