MLIR 24.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).print(llvm::errs());
36 llvm::errs() << "\n";
37}
38
39bool mlirAffineExprIsSymbolicOrConstant(MlirAffineExpr affineExpr) {
40 return unwrap(affineExpr).isSymbolicOrConstant();
41}
42
43bool mlirAffineExprIsPureAffine(MlirAffineExpr affineExpr) {
44 return unwrap(affineExpr).isPureAffine();
45}
46
48 return unwrap(affineExpr).getLargestKnownDivisor();
49}
50
51bool mlirAffineExprIsMultipleOf(MlirAffineExpr affineExpr, int64_t factor) {
52 return unwrap(affineExpr).isMultipleOf(factor);
53}
54
55bool mlirAffineExprIsFunctionOfDim(MlirAffineExpr affineExpr,
56 intptr_t position) {
57 return unwrap(affineExpr).isFunctionOfDim(position);
58}
59
60MlirAffineExpr mlirAffineExprCompose(MlirAffineExpr affineExpr,
61 MlirAffineMap affineMap) {
62 return wrap(unwrap(affineExpr).compose(unwrap(affineMap)));
63}
64
65MlirAffineExpr mlirAffineExprShiftDims(MlirAffineExpr affineExpr,
66 uint32_t numDims, uint32_t shift,
67 uint32_t offset) {
68 return wrap(unwrap(affineExpr).shiftDims(numDims, shift, offset));
69}
70
71MlirAffineExpr mlirAffineExprShiftSymbols(MlirAffineExpr affineExpr,
72 uint32_t numSymbols, uint32_t shift,
73 uint32_t offset) {
74 return wrap(unwrap(affineExpr).shiftSymbols(numSymbols, shift, offset));
75}
76
77MlirAffineExpr mlirSimplifyAffineExpr(MlirAffineExpr expr, uint32_t numDims,
78 uint32_t numSymbols) {
79 return wrap(simplifyAffineExpr(unwrap(expr), numDims, numSymbols));
80}
81
82//===----------------------------------------------------------------------===//
83// Affine Dimension Expression.
84//===----------------------------------------------------------------------===//
85
86bool mlirAffineExprIsADim(MlirAffineExpr affineExpr) {
87 return isa<AffineDimExpr>(unwrap(affineExpr));
88}
89
90MlirAffineExpr mlirAffineDimExprGet(MlirContext ctx, intptr_t position) {
91 return wrap(getAffineDimExpr(position, unwrap(ctx)));
92}
93
94intptr_t mlirAffineDimExprGetPosition(MlirAffineExpr affineExpr) {
95 return cast<AffineDimExpr>(unwrap(affineExpr)).getPosition();
96}
97
98//===----------------------------------------------------------------------===//
99// Affine Symbol Expression.
100//===----------------------------------------------------------------------===//
101
102bool mlirAffineExprIsASymbol(MlirAffineExpr affineExpr) {
103 return isa<AffineSymbolExpr>(unwrap(affineExpr));
104}
105
106MlirAffineExpr mlirAffineSymbolExprGet(MlirContext ctx, intptr_t position) {
107 return wrap(getAffineSymbolExpr(position, unwrap(ctx)));
108}
109
110intptr_t mlirAffineSymbolExprGetPosition(MlirAffineExpr affineExpr) {
111 return cast<AffineSymbolExpr>(unwrap(affineExpr)).getPosition();
112}
113
114//===----------------------------------------------------------------------===//
115// Affine Constant Expression.
116//===----------------------------------------------------------------------===//
117
118bool mlirAffineExprIsAConstant(MlirAffineExpr affineExpr) {
119 return isa<AffineConstantExpr>(unwrap(affineExpr));
120}
121
122MlirAffineExpr mlirAffineConstantExprGet(MlirContext ctx, int64_t constant) {
123 return wrap(getAffineConstantExpr(constant, unwrap(ctx)));
124}
125
126int64_t mlirAffineConstantExprGetValue(MlirAffineExpr affineExpr) {
127 return cast<AffineConstantExpr>(unwrap(affineExpr)).getValue();
128}
129
130//===----------------------------------------------------------------------===//
131// Affine Add Expression.
132//===----------------------------------------------------------------------===//
133
134bool mlirAffineExprIsAAdd(MlirAffineExpr affineExpr) {
135 return unwrap(affineExpr).getKind() == mlir::AffineExprKind::Add;
136}
137
138MlirAffineExpr mlirAffineAddExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs) {
140 unwrap(rhs)));
141}
142
143//===----------------------------------------------------------------------===//
144// Affine Mul Expression.
145//===----------------------------------------------------------------------===//
146
147bool mlirAffineExprIsAMul(MlirAffineExpr affineExpr) {
148 return unwrap(affineExpr).getKind() == mlir::AffineExprKind::Mul;
149}
150
151MlirAffineExpr mlirAffineMulExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs) {
153 unwrap(rhs)));
154}
155
156//===----------------------------------------------------------------------===//
157// Affine Mod Expression.
158//===----------------------------------------------------------------------===//
159
160bool mlirAffineExprIsAMod(MlirAffineExpr affineExpr) {
161 return unwrap(affineExpr).getKind() == mlir::AffineExprKind::Mod;
162}
163
164MlirAffineExpr mlirAffineModExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs) {
166 unwrap(rhs)));
167}
168
169//===----------------------------------------------------------------------===//
170// Affine FloorDiv Expression.
171//===----------------------------------------------------------------------===//
172
173bool mlirAffineExprIsAFloorDiv(MlirAffineExpr affineExpr) {
174 return unwrap(affineExpr).getKind() == mlir::AffineExprKind::FloorDiv;
175}
176
177MlirAffineExpr mlirAffineFloorDivExprGet(MlirAffineExpr lhs,
178 MlirAffineExpr rhs) {
180 unwrap(rhs)));
181}
182
183//===----------------------------------------------------------------------===//
184// Affine CeilDiv Expression.
185//===----------------------------------------------------------------------===//
186
187bool mlirAffineExprIsACeilDiv(MlirAffineExpr affineExpr) {
188 return unwrap(affineExpr).getKind() == mlir::AffineExprKind::CeilDiv;
189}
190
191MlirAffineExpr mlirAffineCeilDivExprGet(MlirAffineExpr lhs,
192 MlirAffineExpr rhs) {
194 unwrap(rhs)));
195}
196
197//===----------------------------------------------------------------------===//
198// Affine Binary Operation Expression.
199//===----------------------------------------------------------------------===//
200
201bool mlirAffineExprIsABinary(MlirAffineExpr affineExpr) {
202 return isa<AffineBinaryOpExpr>(unwrap(affineExpr));
203}
204
205MlirAffineExpr mlirAffineBinaryOpExprGetLHS(MlirAffineExpr affineExpr) {
206 return wrap(cast<AffineBinaryOpExpr>(unwrap(affineExpr)).getLHS());
207}
208
209MlirAffineExpr mlirAffineBinaryOpExprGetRHS(MlirAffineExpr affineExpr) {
210 return wrap(cast<AffineBinaryOpExpr>(unwrap(affineExpr)).getRHS());
211}
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)
b getContext())
void print(raw_ostream &os, std::optional< int64_t > messagePartIndex=std::nullopt) 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:110
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)