summaryrefslogtreecommitdiffstats
path: root/mlir/lib/IR/AffineMap.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mlir/lib/IR/AffineMap.cpp')
-rw-r--r--mlir/lib/IR/AffineMap.cpp14
1 files changed, 14 insertions, 0 deletions
diff --git a/mlir/lib/IR/AffineMap.cpp b/mlir/lib/IR/AffineMap.cpp
index e56d0e83f65..98357b1348b 100644
--- a/mlir/lib/IR/AffineMap.cpp
+++ b/mlir/lib/IR/AffineMap.cpp
@@ -106,6 +106,20 @@ AffineMap AffineMap::getConstantMap(int64_t val, MLIRContext *context) {
{getAffineConstantExpr(val, context)});
}
+/// Returns an AffineMap representing a permutation.
+AffineMap AffineMap::getPermutationMap(ArrayRef<unsigned> permutation,
+ MLIRContext *context) {
+ assert(!permutation.empty() &&
+ "Cannot create permutation map from empty permutation vector");
+ SmallVector<AffineExpr, 4> affExprs;
+ for (auto index : permutation)
+ affExprs.push_back(getAffineDimExpr(index, context));
+ auto m = std::max_element(permutation.begin(), permutation.end());
+ auto permutationMap = AffineMap::get(*m + 1, 0, affExprs);
+ assert(permutationMap.isPermutation() && "Invalid permutation vector");
+ return permutationMap;
+}
+
AffineMap AffineMap::getMultiDimIdentityMap(unsigned numDims,
MLIRContext *context) {
SmallVector<AffineExpr, 4> dimExprs;
OpenPOWER on IntegriCloud