MLIR 24.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) {
36 unwrap(affineMap).print(llvm::errs());
37 llvm::errs() << "\n";
38}
39
40MlirAffineMap mlirAffineMapEmptyGet(MlirContext ctx) {
41 return wrap(AffineMap::get(unwrap(ctx)));
42}
43
44MlirAffineMap mlirAffineMapZeroResultGet(MlirContext ctx, intptr_t dimCount,
45 intptr_t symbolCount) {
46 return wrap(AffineMap::get(dimCount, symbolCount, unwrap(ctx)));
47}
48
49MlirAffineMap mlirAffineMapGet(MlirContext ctx, intptr_t dimCount,
50 intptr_t symbolCount, intptr_t nAffineExprs,
51 MlirAffineExpr *affineExprs) {
53 ArrayRef<AffineExpr> exprList = unwrapList(nAffineExprs, affineExprs, exprs);
54 return wrap(AffineMap::get(dimCount, symbolCount, exprList, unwrap(ctx)));
55}
56
57MlirAffineMap mlirAffineMapConstantGet(MlirContext ctx, int64_t val) {
58 return wrap(AffineMap::getConstantMap(val, unwrap(ctx)));
59}
60
61MlirAffineMap mlirAffineMapMultiDimIdentityGet(MlirContext ctx,
62 intptr_t numDims) {
63 return wrap(AffineMap::getMultiDimIdentityMap(numDims, unwrap(ctx)));
64}
65
66MlirAffineMap mlirAffineMapMinorIdentityGet(MlirContext ctx, intptr_t dims,
67 intptr_t results) {
68 return wrap(AffineMap::getMinorIdentityMap(dims, results, unwrap(ctx)));
69}
70
71MlirAffineMap mlirAffineMapPermutationGet(MlirContext ctx, intptr_t size,
72 unsigned *permutation) {
74 llvm::ArrayRef(permutation, static_cast<size_t>(size)), unwrap(ctx)));
75}
76
77bool mlirAffineMapIsIdentity(MlirAffineMap affineMap) {
78 return unwrap(affineMap).isIdentity();
79}
80
81bool mlirAffineMapIsMinorIdentity(MlirAffineMap affineMap) {
82 return unwrap(affineMap).isMinorIdentity();
83}
84
85bool mlirAffineMapIsEmpty(MlirAffineMap affineMap) {
86 return unwrap(affineMap).isEmpty();
87}
88
89bool mlirAffineMapIsSingleConstant(MlirAffineMap affineMap) {
90 return unwrap(affineMap).isSingleConstant();
91}
92
94 return unwrap(affineMap).getSingleConstantResult();
95}
96
97intptr_t mlirAffineMapGetNumDims(MlirAffineMap affineMap) {
98 return unwrap(affineMap).getNumDims();
99}
100
101intptr_t mlirAffineMapGetNumSymbols(MlirAffineMap affineMap) {
102 return unwrap(affineMap).getNumSymbols();
103}
104
105intptr_t mlirAffineMapGetNumResults(MlirAffineMap affineMap) {
106 return unwrap(affineMap).getNumResults();
107}
108
109MlirAffineExpr mlirAffineMapGetResult(MlirAffineMap affineMap, intptr_t pos) {
110 return wrap(unwrap(affineMap).getResult(static_cast<unsigned>(pos)));
111}
112
113intptr_t mlirAffineMapGetNumInputs(MlirAffineMap affineMap) {
114 return unwrap(affineMap).getNumInputs();
115}
116
117bool mlirAffineMapIsProjectedPermutation(MlirAffineMap affineMap) {
118 return unwrap(affineMap).isProjectedPermutation();
119}
120
121bool mlirAffineMapIsPermutation(MlirAffineMap affineMap) {
122 return unwrap(affineMap).isPermutation();
123}
124
125MlirAffineMap mlirAffineMapGetSubMap(MlirAffineMap affineMap, intptr_t size,
126 intptr_t *resultPos) {
128 pos.reserve(size);
129 for (intptr_t i = 0; i < size; ++i)
130 pos.push_back(static_cast<unsigned>(resultPos[i]));
131 return wrap(unwrap(affineMap).getSubMap(pos));
132}
133
134MlirAffineMap mlirAffineMapGetMajorSubMap(MlirAffineMap affineMap,
135 intptr_t numResults) {
136 return wrap(unwrap(affineMap).getMajorSubMap(numResults));
137}
138
139MlirAffineMap mlirAffineMapGetMinorSubMap(MlirAffineMap affineMap,
140 intptr_t numResults) {
141 return wrap(unwrap(affineMap).getMinorSubMap(numResults));
142}
143
144MlirAffineMap mlirAffineMapReplace(MlirAffineMap affineMap,
145 MlirAffineExpr expression,
146 MlirAffineExpr replacement,
147 intptr_t numResultDims,
148 intptr_t numResultSyms) {
149 return wrap(unwrap(affineMap).replace(unwrap(expression), unwrap(replacement),
150 numResultDims, numResultSyms));
151}
152
154 MlirAffineMap *affineMaps, intptr_t size, void *result,
155 void (*populateResult)(void *res, intptr_t idx, MlirAffineMap m)) {
157 for (intptr_t idx = 0; idx < size; ++idx)
158 maps.push_back(unwrap(affineMaps[idx]));
159 intptr_t idx = 0;
160 for (auto m : mlir::compressUnusedSymbols(maps))
161 populateResult(result, idx++, wrap(m));
162}
MlirAffineMap mlirAffineMapMultiDimIdentityGet(MlirContext ctx, intptr_t numDims)
Definition AffineMap.cpp:61
MlirAffineMap mlirAffineMapPermutationGet(MlirContext ctx, intptr_t size, unsigned *permutation)
Definition AffineMap.cpp:71
void mlirAffineMapDump(MlirAffineMap affineMap)
Definition AffineMap.cpp:35
bool mlirAffineMapIsProjectedPermutation(MlirAffineMap affineMap)
bool mlirAffineMapIsEmpty(MlirAffineMap affineMap)
Definition AffineMap.cpp:85
MlirAffineMap mlirAffineMapConstantGet(MlirContext ctx, int64_t val)
Definition AffineMap.cpp:57
MlirAffineExpr mlirAffineMapGetResult(MlirAffineMap affineMap, intptr_t pos)
intptr_t mlirAffineMapGetNumInputs(MlirAffineMap affineMap)
bool mlirAffineMapIsMinorIdentity(MlirAffineMap affineMap)
Definition AffineMap.cpp:81
MlirAffineMap mlirAffineMapZeroResultGet(MlirContext ctx, intptr_t dimCount, intptr_t symbolCount)
Definition AffineMap.cpp:44
int64_t mlirAffineMapGetSingleConstantResult(MlirAffineMap affineMap)
Definition AffineMap.cpp:93
MlirAffineMap mlirAffineMapGet(MlirContext ctx, intptr_t dimCount, intptr_t symbolCount, intptr_t nAffineExprs, MlirAffineExpr *affineExprs)
Definition AffineMap.cpp:49
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:40
MlirAffineMap mlirAffineMapGetMajorSubMap(MlirAffineMap affineMap, intptr_t numResults)
bool mlirAffineMapIsSingleConstant(MlirAffineMap affineMap)
Definition AffineMap.cpp:89
MlirAffineMap mlirAffineMapMinorIdentityGet(MlirContext ctx, intptr_t dims, intptr_t results)
Definition AffineMap.cpp:66
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:97
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)
bool mlirAffineMapIsIdentity(MlirAffineMap affineMap)
Definition AffineMap.cpp:77
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`
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, 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.
AffineMap compressUnusedSymbols(AffineMap map)
Drop the symbols that are not used.