MLIR 22.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"
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
18using namespace mlir;
19
20MlirContext mlirAffineExprGetContext(MlirAffineExpr affineExpr) {
21 return wrap(unwrap(affineExpr).getContext());
22}
23
24bool mlirAffineExprEqual(MlirAffineExpr lhs, MlirAffineExpr rhs) {
25 return unwrap(lhs) == unwrap(rhs);
26}
27
28void mlirAffineExprPrint(MlirAffineExpr affineExpr, MlirStringCallback callback,
29 void *userData) {
30 mlir::detail::CallbackOstream stream(callback, userData);
31 unwrap(affineExpr).print(stream);
32}
33
34void mlirAffineExprDump(MlirAffineExpr affineExpr) {
35 unwrap(affineExpr).dump();
36}
37
38bool mlirAffineExprIsSymbolicOrConstant(MlirAffineExpr affineExpr) {
39 return unwrap(affineExpr).isSymbolicOrConstant();
40}
41
42bool mlirAffineExprIsPureAffine(MlirAffineExpr affineExpr) {
43 return unwrap(affineExpr).isPureAffine();
44}
45
47 return unwrap(affineExpr).getLargestKnownDivisor();
48}
49
50bool mlirAffineExprIsMultipleOf(MlirAffineExpr affineExpr, int64_t factor) {
51 return unwrap(affineExpr).isMultipleOf(factor);
52}
53
54bool mlirAffineExprIsFunctionOfDim(MlirAffineExpr affineExpr,
55 intptr_t position) {
56 return unwrap(affineExpr).isFunctionOfDim(position);
57}
58
59MlirAffineExpr mlirAffineExprCompose(MlirAffineExpr affineExpr,
60 MlirAffineMap affineMap) {
61 return wrap(unwrap(affineExpr).compose(unwrap(affineMap)));
62}
63
64MlirAffineExpr 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
70MlirAffineExpr 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
76MlirAffineExpr 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
85bool mlirAffineExprIsADim(MlirAffineExpr affineExpr) {
86 return isa<AffineDimExpr>(unwrap(affineExpr));
87}
88
89MlirAffineExpr mlirAffineDimExprGet(MlirContext ctx, intptr_t position) {
90 return wrap(getAffineDimExpr(position, unwrap(ctx)));
91}
92
93intptr_t mlirAffineDimExprGetPosition(MlirAffineExpr affineExpr) {
94 return cast<AffineDimExpr>(unwrap(affineExpr)).getPosition();
95}
96
97//===----------------------------------------------------------------------===//
98// Affine Symbol Expression.
99//===----------------------------------------------------------------------===//
100
101bool mlirAffineExprIsASymbol(MlirAffineExpr affineExpr) {
102 return isa<AffineSymbolExpr>(unwrap(affineExpr));
103}
104
105MlirAffineExpr mlirAffineSymbolExprGet(MlirContext ctx, intptr_t position) {
106 return wrap(getAffineSymbolExpr(position, unwrap(ctx)));
107}
108
109intptr_t mlirAffineSymbolExprGetPosition(MlirAffineExpr affineExpr) {
110 return cast<AffineSymbolExpr>(unwrap(affineExpr)).getPosition();
111}
112
113//===----------------------------------------------------------------------===//
114// Affine Constant Expression.
115//===----------------------------------------------------------------------===//
116
117bool mlirAffineExprIsAConstant(MlirAffineExpr affineExpr) {
118 return isa<AffineConstantExpr>(unwrap(affineExpr));
119}
120
121MlirAffineExpr mlirAffineConstantExprGet(MlirContext ctx, int64_t constant) {
122 return wrap(getAffineConstantExpr(constant, unwrap(ctx)));
123}
124
125int64_t mlirAffineConstantExprGetValue(MlirAffineExpr affineExpr) {
126 return cast<AffineConstantExpr>(unwrap(affineExpr)).getValue();
127}
128
129//===----------------------------------------------------------------------===//
130// Affine Add Expression.
131//===----------------------------------------------------------------------===//
132
133bool mlirAffineExprIsAAdd(MlirAffineExpr affineExpr) {
134 return unwrap(affineExpr).getKind() == mlir::AffineExprKind::Add;
135}
136
137MlirAffineExpr mlirAffineAddExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs) {
139 unwrap(rhs)));
140}
141
142//===----------------------------------------------------------------------===//
143// Affine Mul Expression.
144//===----------------------------------------------------------------------===//
145
146bool mlirAffineExprIsAMul(MlirAffineExpr affineExpr) {
147 return unwrap(affineExpr).getKind() == mlir::AffineExprKind::Mul;
148}
149
150MlirAffineExpr mlirAffineMulExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs) {
152 unwrap(rhs)));
153}
154
155//===----------------------------------------------------------------------===//
156// Affine Mod Expression.
157//===----------------------------------------------------------------------===//
158
159bool mlirAffineExprIsAMod(MlirAffineExpr affineExpr) {
160 return unwrap(affineExpr).getKind() == mlir::AffineExprKind::Mod;
161}
162
163MlirAffineExpr mlirAffineModExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs) {
165 unwrap(rhs)));
166}
167
168//===----------------------------------------------------------------------===//
169// Affine FloorDiv Expression.
170//===----------------------------------------------------------------------===//
171
172bool mlirAffineExprIsAFloorDiv(MlirAffineExpr affineExpr) {
173 return unwrap(affineExpr).getKind() == mlir::AffineExprKind::FloorDiv;
174}
175
176MlirAffineExpr mlirAffineFloorDivExprGet(MlirAffineExpr lhs,
177 MlirAffineExpr rhs) {
179 unwrap(rhs)));
180}
181
182//===----------------------------------------------------------------------===//
183// Affine CeilDiv Expression.
184//===----------------------------------------------------------------------===//
185
186bool mlirAffineExprIsACeilDiv(MlirAffineExpr affineExpr) {
187 return unwrap(affineExpr).getKind() == mlir::AffineExprKind::CeilDiv;
188}
189
190MlirAffineExpr mlirAffineCeilDivExprGet(MlirAffineExpr lhs,
191 MlirAffineExpr rhs) {
193 unwrap(rhs)));
194}
195
196//===----------------------------------------------------------------------===//
197// Affine Binary Operation Expression.
198//===----------------------------------------------------------------------===//
199
200bool mlirAffineExprIsABinary(MlirAffineExpr affineExpr) {
201 return isa<AffineBinaryOpExpr>(unwrap(affineExpr));
202}
203
204MlirAffineExpr mlirAffineBinaryOpExprGetLHS(MlirAffineExpr affineExpr) {
205 return wrap(cast<AffineBinaryOpExpr>(unwrap(affineExpr)).getLHS());
206}
207
208MlirAffineExpr mlirAffineBinaryOpExprGetRHS(MlirAffineExpr affineExpr) {
209 return wrap(cast<AffineBinaryOpExpr>(unwrap(affineExpr)).getRHS());
210}
MlirAffineExpr mlirAffineExprCompose(MlirAffineExpr affineExpr, MlirAffineMap affineMap)
bool mlirAffineExprIsSymbolicOrConstant(MlirAffineExpr affineExpr)
void mlirAffineExprDump(MlirAffineExpr affineExpr)
int64_t mlirAffineExprGetLargestKnownDivisor(MlirAffineExpr affineExpr)
MlirAffineExpr mlirAffineCeilDivExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs)
Creates an affine ceildiv expression with 'lhs' and 'rhs'.
bool mlirAffineExprIsFunctionOfDim(MlirAffineExpr affineExpr, intptr_t position)
MlirAffineExpr mlirAffineFloorDivExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs)
Creates an affine floordiv expression with 'lhs' and 'rhs'.
bool mlirAffineExprIsABinary(MlirAffineExpr affineExpr)
Checks whether the given affine expression is binary.
MlirAffineExpr mlirSimplifyAffineExpr(MlirAffineExpr expr, uint32_t numDims, uint32_t numSymbols)
Prints an affine expression by sending chunks of the string representation and forwarding userData to...
bool mlirAffineExprIsACeilDiv(MlirAffineExpr affineExpr)
Checks whether the given affine expression is an ceildiv expression.
bool mlirAffineExprIsAConstant(MlirAffineExpr affineExpr)
Checks whether the given affine expression is a constant expression.
MlirAffineExpr mlirAffineExprShiftDims(MlirAffineExpr affineExpr, uint32_t numDims, uint32_t shift, uint32_t offset)
void mlirAffineExprPrint(MlirAffineExpr affineExpr, MlirStringCallback callback, void *userData)
bool mlirAffineExprIsADim(MlirAffineExpr affineExpr)
Checks whether the given affine expression is a dimension expression.
bool mlirAffineExprIsAAdd(MlirAffineExpr affineExpr)
Checks whether the given affine expression is an add expression.
intptr_t mlirAffineDimExprGetPosition(MlirAffineExpr affineExpr)
Returns the position of the given affine dimension expression.
MlirAffineExpr mlirAffineBinaryOpExprGetLHS(MlirAffineExpr affineExpr)
Returns the left hand side affine expression of the given affine binary operation expression.
bool mlirAffineExprEqual(MlirAffineExpr lhs, MlirAffineExpr rhs)
Returns true if the two affine expressions are equal.
MlirAffineExpr mlirAffineAddExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs)
Creates an affine add expression with 'lhs' and 'rhs'.
bool mlirAffineExprIsAFloorDiv(MlirAffineExpr affineExpr)
Checks whether the given affine expression is an floordiv expression.
MlirAffineExpr mlirAffineMulExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs)
Creates an affine mul expression with 'lhs' and 'rhs'.
MlirAffineExpr mlirAffineBinaryOpExprGetRHS(MlirAffineExpr affineExpr)
Returns the right hand side affine expression of the given affine binary operation expression.
MlirAffineExpr mlirAffineSymbolExprGet(MlirContext ctx, intptr_t position)
Creates an affine symbol expression with 'position' in the context.
bool mlirAffineExprIsAMul(MlirAffineExpr affineExpr)
Checks whether the given affine expression is an mul expression.
intptr_t mlirAffineSymbolExprGetPosition(MlirAffineExpr affineExpr)
Returns the position of the given affine symbol expression.
MlirAffineExpr mlirAffineConstantExprGet(MlirContext ctx, int64_t constant)
Creates an affine constant expression with 'constant' in the context.
bool mlirAffineExprIsAMod(MlirAffineExpr affineExpr)
Checks whether the given affine expression is an mod expression.
bool mlirAffineExprIsASymbol(MlirAffineExpr affineExpr)
Checks whether the given affine expression is a symbol expression.
bool mlirAffineExprIsPureAffine(MlirAffineExpr affineExpr)
MlirAffineExpr mlirAffineModExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs)
Creates an affine mod expression with 'lhs' and 'rhs'.
MlirContext mlirAffineExprGetContext(MlirAffineExpr affineExpr)
Gets the context that owns the affine expression.
MlirAffineExpr mlirAffineDimExprGet(MlirContext ctx, intptr_t position)
Creates an affine dimension expression with 'position' in the context.
bool mlirAffineExprIsMultipleOf(MlirAffineExpr affineExpr, int64_t factor)
int64_t mlirAffineConstantExprGetValue(MlirAffineExpr affineExpr)
Returns the value of the given affine constant expression.
MlirAffineExpr mlirAffineExprShiftSymbols(MlirAffineExpr affineExpr, uint32_t numSymbols, uint32_t shift, uint32_t offset)
lhs
b getContext())
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
MlirDiagnostic wrap(mlir::Diagnostic &diagnostic)
Definition Diagnostics.h:24
mlir::Diagnostic & unwrap(MlirDiagnostic diagnostic)
Definition Diagnostics.h:19
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.
Definition AffineExpr.h:50
@ Mul
RHS of mul is always a constant or a symbolic expression.
Definition AffineExpr.h:43
@ Mod
RHS of mod is always a constant or a symbolic expression with a positive value.
Definition AffineExpr.h:46
@ FloorDiv
RHS of floordiv is always a constant or a symbolic expression.
Definition AffineExpr.h:48
AffineExpr getAffineBinaryOpExpr(AffineExprKind kind, AffineExpr lhs, AffineExpr rhs)
AffineExpr getAffineConstantExpr(int64_t constant, MLIRContext *context)
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.
AffineExpr getAffineSymbolExpr(unsigned position, MLIRContext *context)