MLIR 22.0.0git
AffineMap.cpp
Go to the documentation of this file.
1//===- AffineMap.cpp - C API for MLIR Affine Maps -------------------------===//
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/AffineMap.h"
10#include "mlir-c/IR.h"
12#include "mlir/CAPI/AffineMap.h"
13#include "mlir/CAPI/IR.h"
14#include "mlir/CAPI/Utils.h"
15#include "mlir/IR/AffineMap.h"
16
17// TODO: expose the C API related to `AffineExpr` and mutable affine map.
18
19using namespace mlir;
20
21MlirContext mlirAffineMapGetContext(MlirAffineMap affineMap) {
22 return wrap(unwrap(affineMap).getContext());
23}
24
25bool mlirAffineMapEqual(MlirAffineMap a1, MlirAffineMap a2) {
26 return unwrap(a1) == unwrap(a2);
27}
28
29void mlirAffineMapPrint(MlirAffineMap affineMap, MlirStringCallback callback,
30 void *userData) {
31 mlir::detail::CallbackOstream stream(callback, userData);
32 unwrap(affineMap).print(stream);
33}
34
35void mlirAffineMapDump(MlirAffineMap affineMap) { unwrap(affineMap).dump(); }
36
37MlirAffineMap mlirAffineMapEmptyGet(MlirContext ctx) {
38 return wrap(AffineMap::get(unwrap(ctx)));
39}
40
41MlirAffineMap mlirAffineMapZeroResultGet(MlirContext ctx, intptr_t dimCount,
42 intptr_t symbolCount) {
43 return wrap(AffineMap::get(dimCount, symbolCount, unwrap(ctx)));
44}
45
46MlirAffineMap mlirAffineMapGet(MlirContext ctx, intptr_t dimCount,
47 intptr_t symbolCount, intptr_t nAffineExprs,
48 MlirAffineExpr *affineExprs) {
50 ArrayRef<AffineExpr> exprList = unwrapList(nAffineExprs, affineExprs, exprs);
51 return wrap(AffineMap::get(dimCount, symbolCount, exprList, unwrap(ctx)));
52}
53
54MlirAffineMap mlirAffineMapConstantGet(MlirContext ctx, int64_t val) {
55 return wrap(AffineMap::getConstantMap(val, unwrap(ctx)));
56}
57
58MlirAffineMap mlirAffineMapMultiDimIdentityGet(MlirContext ctx,
59 intptr_t numDims) {
60 return wrap(AffineMap::getMultiDimIdentityMap(numDims, unwrap(ctx)));
61}
62
63MlirAffineMap mlirAffineMapMinorIdentityGet(MlirContext ctx, intptr_t dims,
64 intptr_t results) {
65 return wrap(AffineMap::getMinorIdentityMap(dims, results, unwrap(ctx)));
66}
67
68MlirAffineMap mlirAffineMapPermutationGet(MlirContext ctx, intptr_t size,
69 unsigned *permutation) {
71 llvm::ArrayRef(permutation, static_cast<size_t>(size)), unwrap(ctx)));
72}
73
74bool mlirAffineMapIsIdentity(MlirAffineMap affineMap) {
75 return unwrap(affineMap).isIdentity();
76}
77
78bool mlirAffineMapIsMinorIdentity(MlirAffineMap affineMap) {
79 return unwrap(affineMap).isMinorIdentity();
80}
81
82bool mlirAffineMapIsEmpty(MlirAffineMap affineMap) {
83 return unwrap(affineMap).isEmpty();
84}
85
86bool mlirAffineMapIsSingleConstant(MlirAffineMap affineMap) {
87 return unwrap(affineMap).isSingleConstant();
88}
89
91 return unwrap(affineMap).getSingleConstantResult();
92}
93
94intptr_t mlirAffineMapGetNumDims(MlirAffineMap affineMap) {
95 return unwrap(affineMap).getNumDims();
96}
97
98intptr_t mlirAffineMapGetNumSymbols(MlirAffineMap affineMap) {
99 return unwrap(affineMap).getNumSymbols();
100}
101
102intptr_t mlirAffineMapGetNumResults(MlirAffineMap affineMap) {
103 return unwrap(affineMap).getNumResults();
104}
105
106MlirAffineExpr mlirAffineMapGetResult(MlirAffineMap affineMap, intptr_t pos) {
107 return wrap(unwrap(affineMap).getResult(static_cast<unsigned>(pos)));
108}
109
110intptr_t mlirAffineMapGetNumInputs(MlirAffineMap affineMap) {
111 return unwrap(affineMap).getNumInputs();
112}
113
114bool mlirAffineMapIsProjectedPermutation(MlirAffineMap affineMap) {
115 return unwrap(affineMap).isProjectedPermutation();
116}
117
118bool mlirAffineMapIsPermutation(MlirAffineMap affineMap) {
119 return unwrap(affineMap).isPermutation();
120}
121
122MlirAffineMap mlirAffineMapGetSubMap(MlirAffineMap affineMap, intptr_t size,
123 intptr_t *resultPos) {
125 pos.reserve(size);
126 for (intptr_t i = 0; i < size; ++i)
127 pos.push_back(static_cast<unsigned>(resultPos[i]));
128 return wrap(unwrap(affineMap).getSubMap(pos));
129}
130
131MlirAffineMap mlirAffineMapGetMajorSubMap(MlirAffineMap affineMap,
132 intptr_t numResults) {
133 return wrap(unwrap(affineMap).getMajorSubMap(numResults));
134}
135
136MlirAffineMap mlirAffineMapGetMinorSubMap(MlirAffineMap affineMap,
137 intptr_t numResults) {
138 return wrap(unwrap(affineMap).getMinorSubMap(numResults));
139}
140
141MlirAffineMap mlirAffineMapReplace(MlirAffineMap affineMap,
142 MlirAffineExpr expression,
143 MlirAffineExpr replacement,
144 intptr_t numResultDims,
145 intptr_t numResultSyms) {
146 return wrap(unwrap(affineMap).replace(unwrap(expression), unwrap(replacement),
147 numResultDims, numResultSyms));
148}
149
151 MlirAffineMap *affineMaps, intptr_t size, void *result,
152 void (*populateResult)(void *res, intptr_t idx, MlirAffineMap m)) {
154 for (intptr_t idx = 0; idx < size; ++idx)
155 maps.push_back(unwrap(affineMaps[idx]));
156 intptr_t idx = 0;
157 for (auto m : mlir::compressUnusedSymbols(maps))
158 populateResult(result, idx++, wrap(m));
159}
MlirAffineMap mlirAffineMapMultiDimIdentityGet(MlirContext ctx, intptr_t numDims)
Definition AffineMap.cpp:58
MlirAffineMap mlirAffineMapPermutationGet(MlirContext ctx, intptr_t size, unsigned *permutation)
Definition AffineMap.cpp:68
void mlirAffineMapDump(MlirAffineMap affineMap)
Definition AffineMap.cpp:35
bool mlirAffineMapIsProjectedPermutation(MlirAffineMap affineMap)
bool mlirAffineMapIsEmpty(MlirAffineMap affineMap)
Definition AffineMap.cpp:82
MlirAffineMap mlirAffineMapConstantGet(MlirContext ctx, int64_t val)
Definition AffineMap.cpp:54
MlirAffineExpr mlirAffineMapGetResult(MlirAffineMap affineMap, intptr_t pos)
intptr_t mlirAffineMapGetNumInputs(MlirAffineMap affineMap)
bool mlirAffineMapIsMinorIdentity(MlirAffineMap affineMap)
Definition AffineMap.cpp:78
MlirAffineMap mlirAffineMapZeroResultGet(MlirContext ctx, intptr_t dimCount, intptr_t symbolCount)
Definition AffineMap.cpp:41
int64_t mlirAffineMapGetSingleConstantResult(MlirAffineMap affineMap)
Definition AffineMap.cpp:90
MlirAffineMap mlirAffineMapGet(MlirContext ctx, intptr_t dimCount, intptr_t symbolCount, intptr_t nAffineExprs, MlirAffineExpr *affineExprs)
Definition AffineMap.cpp:46
MlirAffineMap mlirAffineMapGetSubMap(MlirAffineMap affineMap, intptr_t size, intptr_t *resultPos)
MlirContext mlirAffineMapGetContext(MlirAffineMap affineMap)
Gets the context that the given affine map was created with.
Definition AffineMap.cpp:21
void mlirAffineMapPrint(MlirAffineMap affineMap, MlirStringCallback callback, void *userData)
Definition AffineMap.cpp:29
MlirAffineMap mlirAffineMapEmptyGet(MlirContext ctx)
Definition AffineMap.cpp:37
MlirAffineMap mlirAffineMapGetMajorSubMap(MlirAffineMap affineMap, intptr_t numResults)
bool mlirAffineMapIsSingleConstant(MlirAffineMap affineMap)
Definition AffineMap.cpp:86
MlirAffineMap mlirAffineMapMinorIdentityGet(MlirContext ctx, intptr_t dims, intptr_t results)
Definition AffineMap.cpp:63
bool mlirAffineMapIsPermutation(MlirAffineMap affineMap)
MlirAffineMap mlirAffineMapGetMinorSubMap(MlirAffineMap affineMap, intptr_t numResults)
bool mlirAffineMapEqual(MlirAffineMap a1, MlirAffineMap a2)
Checks if two affine maps are equal.
Definition AffineMap.cpp:25
intptr_t mlirAffineMapGetNumDims(MlirAffineMap affineMap)
Definition AffineMap.cpp:94
intptr_t mlirAffineMapGetNumResults(MlirAffineMap affineMap)
MlirAffineMap mlirAffineMapReplace(MlirAffineMap affineMap, MlirAffineExpr expression, MlirAffineExpr replacement, intptr_t numResultDims, intptr_t numResultSyms)
void mlirAffineMapCompressUnusedSymbols(MlirAffineMap *affineMaps, intptr_t size, void *result, void(*populateResult)(void *res, intptr_t idx, MlirAffineMap m))
Prints an affine map by sending chunks of the string representation and forwarding userData to callba...
intptr_t mlirAffineMapGetNumSymbols(MlirAffineMap affineMap)
Definition AffineMap.cpp:98
bool mlirAffineMapIsIdentity(MlirAffineMap affineMap)
Definition AffineMap.cpp:74
b getContext())
*if copies could not be generated due to yet unimplemented cases *copyInPlacementStart and copyOutPlacementStart in copyPlacementBlock *specify the insertion points where the incoming copies and outgoing should be the output argument nBegin is set to its * replacement(set to `begin` if no invalidation happens). Since outgoing *copies could have been inserted at `end`
static llvm::ArrayRef< CppTy > unwrapList(size_t size, CTy *first, llvm::SmallVectorImpl< CppTy > &storage)
Definition Wrap.h:40
static AffineMap getMinorIdentityMap(unsigned dims, unsigned results, MLIRContext *context)
Returns an identity affine map (d0, ..., dn) -> (dp, ..., dn) on the most minor dimensions.
static AffineMap getMultiDimIdentityMap(unsigned numDims, MLIRContext *context)
Returns an AffineMap with 'numDims' identity result dim exprs.
static AffineMap get(MLIRContext *context)
Returns a zero result affine map with no dimensions or symbols: () -> ().
static AffineMap getPermutationMap(ArrayRef< unsigned > permutation, MLIRContext *context)
Returns an AffineMap representing a permutation.
static AffineMap getConstantMap(int64_t val, MLIRContext *context)
Returns a single constant result affine map.
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.
AffineMap compressUnusedSymbols(AffineMap map)
Drop the symbols that are not used.