MLIR  21.0.0git
AffineExpr.cpp
Go to the documentation of this file.
1 //===- AffineExpr.cpp - C API for MLIR Affine Expressions -----------------===//
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 #include "mlir-c/AffineExpr.h"
10 #include "mlir-c/AffineMap.h"
11 #include "mlir-c/IR.h"
12 #include "mlir/CAPI/AffineExpr.h"
13 #include "mlir/CAPI/AffineMap.h"
14 #include "mlir/CAPI/IR.h"
15 #include "mlir/CAPI/Utils.h"
16 #include "mlir/IR/AffineExpr.h"
17 
18 using namespace mlir;
19 
20 MlirContext mlirAffineExprGetContext(MlirAffineExpr affineExpr) {
21  return wrap(unwrap(affineExpr).getContext());
22 }
23 
24 bool mlirAffineExprEqual(MlirAffineExpr lhs, MlirAffineExpr rhs) {
25  return unwrap(lhs) == unwrap(rhs);
26 }
27 
28 void mlirAffineExprPrint(MlirAffineExpr affineExpr, MlirStringCallback callback,
29  void *userData) {
30  mlir::detail::CallbackOstream stream(callback, userData);
31  unwrap(affineExpr).print(stream);
32 }
33 
34 void mlirAffineExprDump(MlirAffineExpr affineExpr) {
35  unwrap(affineExpr).dump();
36 }
37 
38 bool mlirAffineExprIsSymbolicOrConstant(MlirAffineExpr affineExpr) {
39  return unwrap(affineExpr).isSymbolicOrConstant();
40 }
41 
42 bool mlirAffineExprIsPureAffine(MlirAffineExpr affineExpr) {
43  return unwrap(affineExpr).isPureAffine();
44 }
45 
46 int64_t mlirAffineExprGetLargestKnownDivisor(MlirAffineExpr affineExpr) {
47  return unwrap(affineExpr).getLargestKnownDivisor();
48 }
49 
50 bool mlirAffineExprIsMultipleOf(MlirAffineExpr affineExpr, int64_t factor) {
51  return unwrap(affineExpr).isMultipleOf(factor);
52 }
53 
54 bool mlirAffineExprIsFunctionOfDim(MlirAffineExpr affineExpr,
55  intptr_t position) {
56  return unwrap(affineExpr).isFunctionOfDim(position);
57 }
58 
59 MlirAffineExpr mlirAffineExprCompose(MlirAffineExpr affineExpr,
60  MlirAffineMap affineMap) {
61  return wrap(unwrap(affineExpr).compose(unwrap(affineMap)));
62 }
63 
64 MlirAffineExpr mlirAffineExprShiftDims(MlirAffineExpr affineExpr,
65  uint32_t numDims, uint32_t shift,
66  uint32_t offset) {
67  return wrap(unwrap(affineExpr).shiftDims(numDims, shift, offset));
68 }
69 
70 MlirAffineExpr mlirAffineExprShiftSymbols(MlirAffineExpr affineExpr,
71  uint32_t numSymbols, uint32_t shift,
72  uint32_t offset) {
73  return wrap(unwrap(affineExpr).shiftSymbols(numSymbols, shift, offset));
74 }
75 
76 MlirAffineExpr mlirSimplifyAffineExpr(MlirAffineExpr expr, uint32_t numDims,
77  uint32_t numSymbols) {
78  return wrap(simplifyAffineExpr(unwrap(expr), numDims, numSymbols));
79 }
80 
81 //===----------------------------------------------------------------------===//
82 // Affine Dimension Expression.
83 //===----------------------------------------------------------------------===//
84 
85 bool mlirAffineExprIsADim(MlirAffineExpr affineExpr) {
86  return isa<AffineDimExpr>(unwrap(affineExpr));
87 }
88 
89 MlirAffineExpr mlirAffineDimExprGet(MlirContext ctx, intptr_t position) {
90  return wrap(getAffineDimExpr(position, unwrap(ctx)));
91 }
92 
93 intptr_t mlirAffineDimExprGetPosition(MlirAffineExpr affineExpr) {
94  return cast<AffineDimExpr>(unwrap(affineExpr)).getPosition();
95 }
96 
97 //===----------------------------------------------------------------------===//
98 // Affine Symbol Expression.
99 //===----------------------------------------------------------------------===//
100 
101 bool mlirAffineExprIsASymbol(MlirAffineExpr affineExpr) {
102  return isa<AffineSymbolExpr>(unwrap(affineExpr));
103 }
104 
105 MlirAffineExpr mlirAffineSymbolExprGet(MlirContext ctx, intptr_t position) {
106  return wrap(getAffineSymbolExpr(position, unwrap(ctx)));
107 }
108 
109 intptr_t mlirAffineSymbolExprGetPosition(MlirAffineExpr affineExpr) {
110  return cast<AffineSymbolExpr>(unwrap(affineExpr)).getPosition();
111 }
112 
113 //===----------------------------------------------------------------------===//
114 // Affine Constant Expression.
115 //===----------------------------------------------------------------------===//
116 
117 bool mlirAffineExprIsAConstant(MlirAffineExpr affineExpr) {
118  return isa<AffineConstantExpr>(unwrap(affineExpr));
119 }
120 
121 MlirAffineExpr mlirAffineConstantExprGet(MlirContext ctx, int64_t constant) {
122  return wrap(getAffineConstantExpr(constant, unwrap(ctx)));
123 }
124 
125 int64_t mlirAffineConstantExprGetValue(MlirAffineExpr affineExpr) {
126  return cast<AffineConstantExpr>(unwrap(affineExpr)).getValue();
127 }
128 
129 //===----------------------------------------------------------------------===//
130 // Affine Add Expression.
131 //===----------------------------------------------------------------------===//
132 
133 bool mlirAffineExprIsAAdd(MlirAffineExpr affineExpr) {
134  return unwrap(affineExpr).getKind() == mlir::AffineExprKind::Add;
135 }
136 
137 MlirAffineExpr mlirAffineAddExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs) {
139  unwrap(rhs)));
140 }
141 
142 //===----------------------------------------------------------------------===//
143 // Affine Mul Expression.
144 //===----------------------------------------------------------------------===//
145 
146 bool mlirAffineExprIsAMul(MlirAffineExpr affineExpr) {
147  return unwrap(affineExpr).getKind() == mlir::AffineExprKind::Mul;
148 }
149 
150 MlirAffineExpr mlirAffineMulExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs) {
152  unwrap(rhs)));
153 }
154 
155 //===----------------------------------------------------------------------===//
156 // Affine Mod Expression.
157 //===----------------------------------------------------------------------===//
158 
159 bool mlirAffineExprIsAMod(MlirAffineExpr affineExpr) {
160  return unwrap(affineExpr).getKind() == mlir::AffineExprKind::Mod;
161 }
162 
163 MlirAffineExpr mlirAffineModExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs) {
165  unwrap(rhs)));
166 }
167 
168 //===----------------------------------------------------------------------===//
169 // Affine FloorDiv Expression.
170 //===----------------------------------------------------------------------===//
171 
172 bool mlirAffineExprIsAFloorDiv(MlirAffineExpr affineExpr) {
173  return unwrap(affineExpr).getKind() == mlir::AffineExprKind::FloorDiv;
174 }
175 
176 MlirAffineExpr mlirAffineFloorDivExprGet(MlirAffineExpr lhs,
177  MlirAffineExpr rhs) {
179  unwrap(rhs)));
180 }
181 
182 //===----------------------------------------------------------------------===//
183 // Affine CeilDiv Expression.
184 //===----------------------------------------------------------------------===//
185 
186 bool mlirAffineExprIsACeilDiv(MlirAffineExpr affineExpr) {
187  return unwrap(affineExpr).getKind() == mlir::AffineExprKind::CeilDiv;
188 }
189 
190 MlirAffineExpr mlirAffineCeilDivExprGet(MlirAffineExpr lhs,
191  MlirAffineExpr rhs) {
193  unwrap(rhs)));
194 }
195 
196 //===----------------------------------------------------------------------===//
197 // Affine Binary Operation Expression.
198 //===----------------------------------------------------------------------===//
199 
200 bool mlirAffineExprIsABinary(MlirAffineExpr affineExpr) {
201  return isa<AffineBinaryOpExpr>(unwrap(affineExpr));
202 }
203 
204 MlirAffineExpr mlirAffineBinaryOpExprGetLHS(MlirAffineExpr affineExpr) {
205  return wrap(cast<AffineBinaryOpExpr>(unwrap(affineExpr)).getLHS());
206 }
207 
208 MlirAffineExpr mlirAffineBinaryOpExprGetRHS(MlirAffineExpr affineExpr) {
209  return wrap(cast<AffineBinaryOpExpr>(unwrap(affineExpr)).getRHS());
210 }
MlirAffineExpr mlirAffineExprCompose(MlirAffineExpr affineExpr, MlirAffineMap affineMap)
Composes the given map with the given expression.
Definition: AffineExpr.cpp:59
bool mlirAffineExprIsSymbolicOrConstant(MlirAffineExpr affineExpr)
Checks whether the given affine expression is made out of only symbols and constants.
Definition: AffineExpr.cpp:38
void mlirAffineExprDump(MlirAffineExpr affineExpr)
Prints the affine expression to the standard error stream.
Definition: AffineExpr.cpp:34
int64_t mlirAffineExprGetLargestKnownDivisor(MlirAffineExpr affineExpr)
Returns the greatest known integral divisor of this affine expression.
Definition: AffineExpr.cpp:46
MlirAffineExpr mlirAffineCeilDivExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs)
Creates an affine ceildiv expression with 'lhs' and 'rhs'.
Definition: AffineExpr.cpp:190
bool mlirAffineExprIsFunctionOfDim(MlirAffineExpr affineExpr, intptr_t position)
Checks whether the given affine expression involves AffineDimExpr 'position'.
Definition: AffineExpr.cpp:54
MlirAffineExpr mlirAffineFloorDivExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs)
Creates an affine floordiv expression with 'lhs' and 'rhs'.
Definition: AffineExpr.cpp:176
bool mlirAffineExprIsABinary(MlirAffineExpr affineExpr)
Checks whether the given affine expression is binary.
Definition: AffineExpr.cpp:200
MlirAffineExpr mlirSimplifyAffineExpr(MlirAffineExpr expr, uint32_t numDims, uint32_t numSymbols)
Simplify an affine expression by flattening and some amount of simple analysis.
Definition: AffineExpr.cpp:76
bool mlirAffineExprIsACeilDiv(MlirAffineExpr affineExpr)
Checks whether the given affine expression is an ceildiv expression.
Definition: AffineExpr.cpp:186
bool mlirAffineExprIsAConstant(MlirAffineExpr affineExpr)
Checks whether the given affine expression is a constant expression.
Definition: AffineExpr.cpp:117
MlirAffineExpr mlirAffineExprShiftDims(MlirAffineExpr affineExpr, uint32_t numDims, uint32_t shift, uint32_t offset)
Replace dims[offset ...
Definition: AffineExpr.cpp:64
void mlirAffineExprPrint(MlirAffineExpr affineExpr, MlirStringCallback callback, void *userData)
Prints an affine expression by sending chunks of the string representation and forwarding userData to...
Definition: AffineExpr.cpp:28
bool mlirAffineExprIsADim(MlirAffineExpr affineExpr)
Checks whether the given affine expression is a dimension expression.
Definition: AffineExpr.cpp:85
bool mlirAffineExprIsAAdd(MlirAffineExpr affineExpr)
Checks whether the given affine expression is an add expression.
Definition: AffineExpr.cpp:133
intptr_t mlirAffineDimExprGetPosition(MlirAffineExpr affineExpr)
Returns the position of the given affine dimension expression.
Definition: AffineExpr.cpp:93
MlirAffineExpr mlirAffineBinaryOpExprGetLHS(MlirAffineExpr affineExpr)
Returns the left hand side affine expression of the given affine binary operation expression.
Definition: AffineExpr.cpp:204
bool mlirAffineExprEqual(MlirAffineExpr lhs, MlirAffineExpr rhs)
Returns true if the two affine expressions are equal.
Definition: AffineExpr.cpp:24
MlirAffineExpr mlirAffineAddExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs)
Creates an affine add expression with 'lhs' and 'rhs'.
Definition: AffineExpr.cpp:137
bool mlirAffineExprIsAFloorDiv(MlirAffineExpr affineExpr)
Checks whether the given affine expression is an floordiv expression.
Definition: AffineExpr.cpp:172
MlirAffineExpr mlirAffineMulExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs)
Creates an affine mul expression with 'lhs' and 'rhs'.
Definition: AffineExpr.cpp:150
MlirAffineExpr mlirAffineBinaryOpExprGetRHS(MlirAffineExpr affineExpr)
Returns the right hand side affine expression of the given affine binary operation expression.
Definition: AffineExpr.cpp:208
MlirAffineExpr mlirAffineSymbolExprGet(MlirContext ctx, intptr_t position)
Creates an affine symbol expression with 'position' in the context.
Definition: AffineExpr.cpp:105
bool mlirAffineExprIsAMul(MlirAffineExpr affineExpr)
Checks whether the given affine expression is an mul expression.
Definition: AffineExpr.cpp:146
intptr_t mlirAffineSymbolExprGetPosition(MlirAffineExpr affineExpr)
Returns the position of the given affine symbol expression.
Definition: AffineExpr.cpp:109
MlirAffineExpr mlirAffineConstantExprGet(MlirContext ctx, int64_t constant)
Creates an affine constant expression with 'constant' in the context.
Definition: AffineExpr.cpp:121
bool mlirAffineExprIsAMod(MlirAffineExpr affineExpr)
Checks whether the given affine expression is an mod expression.
Definition: AffineExpr.cpp:159
bool mlirAffineExprIsASymbol(MlirAffineExpr affineExpr)
Checks whether the given affine expression is a symbol expression.
Definition: AffineExpr.cpp:101
bool mlirAffineExprIsPureAffine(MlirAffineExpr affineExpr)
Checks whether the given affine expression is a pure affine expression, i.e.
Definition: AffineExpr.cpp:42
MlirAffineExpr mlirAffineModExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs)
Creates an affine mod expression with 'lhs' and 'rhs'.
Definition: AffineExpr.cpp:163
MlirContext mlirAffineExprGetContext(MlirAffineExpr affineExpr)
Gets the context that owns the affine expression.
Definition: AffineExpr.cpp:20
MlirAffineExpr mlirAffineDimExprGet(MlirContext ctx, intptr_t position)
Creates an affine dimension expression with 'position' in the context.
Definition: AffineExpr.cpp:89
bool mlirAffineExprIsMultipleOf(MlirAffineExpr affineExpr, int64_t factor)
Checks whether the given affine expression is a multiple of 'factor'.
Definition: AffineExpr.cpp:50
int64_t mlirAffineConstantExprGetValue(MlirAffineExpr affineExpr)
Returns the value of the given affine constant expression.
Definition: AffineExpr.cpp:125
MlirAffineExpr mlirAffineExprShiftSymbols(MlirAffineExpr affineExpr, uint32_t numSymbols, uint32_t shift, uint32_t offset)
Replace symbols[offset ...
Definition: AffineExpr.cpp:70
static MLIRContext * getContext(OpFoldResult val)
void print(raw_ostream &os) const
Outputs this diagnostic to a stream.
A simple raw ostream subclass that forwards write_impl calls to the user-supplied callback together w...
Definition: Utils.h:30
mlir::Diagnostic & unwrap(MlirDiagnostic diagnostic)
Definition: Diagnostics.h:19
MlirDiagnostic wrap(mlir::Diagnostic &diagnostic)
Definition: Diagnostics.h:24
void(* MlirStringCallback)(MlirStringRef, void *)
A callback for returning string references.
Definition: Support.h:105
Include the generated interface declarations.
@ 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.
@ FloorDiv
RHS of floordiv is always a constant or a symbolic expression.
AffineExpr getAffineBinaryOpExpr(AffineExprKind kind, AffineExpr lhs, AffineExpr rhs)
Definition: AffineExpr.cpp:70
AffineExpr getAffineConstantExpr(int64_t constant, MLIRContext *context)
Definition: AffineExpr.cpp:645
AffineExpr simplifyAffineExpr(AffineExpr expr, unsigned numDims, unsigned numSymbols)
Simplify an affine expression by flattening and some amount of simple analysis.
AffineExpr getAffineDimExpr(unsigned position, MLIRContext *context)
These free functions allow clients of the API to not use classes in detail.
Definition: AffineExpr.cpp:621
AffineExpr getAffineSymbolExpr(unsigned position, MLIRContext *context)
Definition: AffineExpr.cpp:631