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 //===----------------------------------------------------------------------===//
77 // Affine Dimension Expression.
78 //===----------------------------------------------------------------------===//
79 
80 bool mlirAffineExprIsADim(MlirAffineExpr affineExpr) {
81  return isa<AffineDimExpr>(unwrap(affineExpr));
82 }
83 
84 MlirAffineExpr mlirAffineDimExprGet(MlirContext ctx, intptr_t position) {
85  return wrap(getAffineDimExpr(position, unwrap(ctx)));
86 }
87 
88 intptr_t mlirAffineDimExprGetPosition(MlirAffineExpr affineExpr) {
89  return cast<AffineDimExpr>(unwrap(affineExpr)).getPosition();
90 }
91 
92 //===----------------------------------------------------------------------===//
93 // Affine Symbol Expression.
94 //===----------------------------------------------------------------------===//
95 
96 bool mlirAffineExprIsASymbol(MlirAffineExpr affineExpr) {
97  return isa<AffineSymbolExpr>(unwrap(affineExpr));
98 }
99 
100 MlirAffineExpr mlirAffineSymbolExprGet(MlirContext ctx, intptr_t position) {
101  return wrap(getAffineSymbolExpr(position, unwrap(ctx)));
102 }
103 
104 intptr_t mlirAffineSymbolExprGetPosition(MlirAffineExpr affineExpr) {
105  return cast<AffineSymbolExpr>(unwrap(affineExpr)).getPosition();
106 }
107 
108 //===----------------------------------------------------------------------===//
109 // Affine Constant Expression.
110 //===----------------------------------------------------------------------===//
111 
112 bool mlirAffineExprIsAConstant(MlirAffineExpr affineExpr) {
113  return isa<AffineConstantExpr>(unwrap(affineExpr));
114 }
115 
116 MlirAffineExpr mlirAffineConstantExprGet(MlirContext ctx, int64_t constant) {
117  return wrap(getAffineConstantExpr(constant, unwrap(ctx)));
118 }
119 
120 int64_t mlirAffineConstantExprGetValue(MlirAffineExpr affineExpr) {
121  return cast<AffineConstantExpr>(unwrap(affineExpr)).getValue();
122 }
123 
124 //===----------------------------------------------------------------------===//
125 // Affine Add Expression.
126 //===----------------------------------------------------------------------===//
127 
128 bool mlirAffineExprIsAAdd(MlirAffineExpr affineExpr) {
129  return unwrap(affineExpr).getKind() == mlir::AffineExprKind::Add;
130 }
131 
132 MlirAffineExpr mlirAffineAddExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs) {
134  unwrap(rhs)));
135 }
136 
137 //===----------------------------------------------------------------------===//
138 // Affine Mul Expression.
139 //===----------------------------------------------------------------------===//
140 
141 bool mlirAffineExprIsAMul(MlirAffineExpr affineExpr) {
142  return unwrap(affineExpr).getKind() == mlir::AffineExprKind::Mul;
143 }
144 
145 MlirAffineExpr mlirAffineMulExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs) {
147  unwrap(rhs)));
148 }
149 
150 //===----------------------------------------------------------------------===//
151 // Affine Mod Expression.
152 //===----------------------------------------------------------------------===//
153 
154 bool mlirAffineExprIsAMod(MlirAffineExpr affineExpr) {
155  return unwrap(affineExpr).getKind() == mlir::AffineExprKind::Mod;
156 }
157 
158 MlirAffineExpr mlirAffineModExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs) {
160  unwrap(rhs)));
161 }
162 
163 //===----------------------------------------------------------------------===//
164 // Affine FloorDiv Expression.
165 //===----------------------------------------------------------------------===//
166 
167 bool mlirAffineExprIsAFloorDiv(MlirAffineExpr affineExpr) {
168  return unwrap(affineExpr).getKind() == mlir::AffineExprKind::FloorDiv;
169 }
170 
171 MlirAffineExpr mlirAffineFloorDivExprGet(MlirAffineExpr lhs,
172  MlirAffineExpr rhs) {
174  unwrap(rhs)));
175 }
176 
177 //===----------------------------------------------------------------------===//
178 // Affine CeilDiv Expression.
179 //===----------------------------------------------------------------------===//
180 
181 bool mlirAffineExprIsACeilDiv(MlirAffineExpr affineExpr) {
182  return unwrap(affineExpr).getKind() == mlir::AffineExprKind::CeilDiv;
183 }
184 
185 MlirAffineExpr mlirAffineCeilDivExprGet(MlirAffineExpr lhs,
186  MlirAffineExpr rhs) {
188  unwrap(rhs)));
189 }
190 
191 //===----------------------------------------------------------------------===//
192 // Affine Binary Operation Expression.
193 //===----------------------------------------------------------------------===//
194 
195 bool mlirAffineExprIsABinary(MlirAffineExpr affineExpr) {
196  return isa<AffineBinaryOpExpr>(unwrap(affineExpr));
197 }
198 
199 MlirAffineExpr mlirAffineBinaryOpExprGetLHS(MlirAffineExpr affineExpr) {
200  return wrap(cast<AffineBinaryOpExpr>(unwrap(affineExpr)).getLHS());
201 }
202 
203 MlirAffineExpr mlirAffineBinaryOpExprGetRHS(MlirAffineExpr affineExpr) {
204  return wrap(cast<AffineBinaryOpExpr>(unwrap(affineExpr)).getRHS());
205 }
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:185
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:171
bool mlirAffineExprIsABinary(MlirAffineExpr affineExpr)
Checks whether the given affine expression is binary.
Definition: AffineExpr.cpp:195
bool mlirAffineExprIsACeilDiv(MlirAffineExpr affineExpr)
Checks whether the given affine expression is an ceildiv expression.
Definition: AffineExpr.cpp:181
bool mlirAffineExprIsAConstant(MlirAffineExpr affineExpr)
Checks whether the given affine expression is a constant expression.
Definition: AffineExpr.cpp:112
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:80
bool mlirAffineExprIsAAdd(MlirAffineExpr affineExpr)
Checks whether the given affine expression is an add expression.
Definition: AffineExpr.cpp:128
intptr_t mlirAffineDimExprGetPosition(MlirAffineExpr affineExpr)
Returns the position of the given affine dimension expression.
Definition: AffineExpr.cpp:88
MlirAffineExpr mlirAffineBinaryOpExprGetLHS(MlirAffineExpr affineExpr)
Returns the left hand side affine expression of the given affine binary operation expression.
Definition: AffineExpr.cpp:199
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:132
bool mlirAffineExprIsAFloorDiv(MlirAffineExpr affineExpr)
Checks whether the given affine expression is an floordiv expression.
Definition: AffineExpr.cpp:167
MlirAffineExpr mlirAffineMulExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs)
Creates an affine mul expression with 'lhs' and 'rhs'.
Definition: AffineExpr.cpp:145
MlirAffineExpr mlirAffineBinaryOpExprGetRHS(MlirAffineExpr affineExpr)
Returns the right hand side affine expression of the given affine binary operation expression.
Definition: AffineExpr.cpp:203
MlirAffineExpr mlirAffineSymbolExprGet(MlirContext ctx, intptr_t position)
Creates an affine symbol expression with 'position' in the context.
Definition: AffineExpr.cpp:100
bool mlirAffineExprIsAMul(MlirAffineExpr affineExpr)
Checks whether the given affine expression is an mul expression.
Definition: AffineExpr.cpp:141
intptr_t mlirAffineSymbolExprGetPosition(MlirAffineExpr affineExpr)
Returns the position of the given affine symbol expression.
Definition: AffineExpr.cpp:104
MlirAffineExpr mlirAffineConstantExprGet(MlirContext ctx, int64_t constant)
Creates an affine constant expression with 'constant' in the context.
Definition: AffineExpr.cpp:116
bool mlirAffineExprIsAMod(MlirAffineExpr affineExpr)
Checks whether the given affine expression is an mod expression.
Definition: AffineExpr.cpp:154
bool mlirAffineExprIsASymbol(MlirAffineExpr affineExpr)
Checks whether the given affine expression is a symbol expression.
Definition: AffineExpr.cpp:96
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:158
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:84
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:120
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 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