1f273e5c5SUday Bondhugula //===- TestLoopPermutation.cpp - Test affine loop permutation -------------===//
2f273e5c5SUday Bondhugula //
3f273e5c5SUday Bondhugula // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4f273e5c5SUday Bondhugula // See https://llvm.org/LICENSE.txt for license information.
5f273e5c5SUday Bondhugula // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6f273e5c5SUday Bondhugula //
7f273e5c5SUday Bondhugula //===----------------------------------------------------------------------===//
8f273e5c5SUday Bondhugula //
9f273e5c5SUday Bondhugula // This file implements a pass to test the affine for op permutation utility.
10f273e5c5SUday Bondhugula //
11f273e5c5SUday Bondhugula //===----------------------------------------------------------------------===//
12f273e5c5SUday Bondhugula
13755dc07dSRiver Riddle #include "mlir/Dialect/Affine/Analysis/Utils.h"
14f273e5c5SUday Bondhugula #include "mlir/Dialect/Affine/IR/AffineOps.h"
15a70aa7bbSRiver Riddle #include "mlir/Dialect/Affine/LoopUtils.h"
16f273e5c5SUday Bondhugula #include "mlir/Pass/Pass.h"
17f273e5c5SUday Bondhugula
18f273e5c5SUday Bondhugula #define PASS_NAME "test-loop-permutation"
19f273e5c5SUday Bondhugula
20f273e5c5SUday Bondhugula using namespace mlir;
21*4c48f016SMatthias Springer using namespace mlir::affine;
22f273e5c5SUday Bondhugula
23f273e5c5SUday Bondhugula namespace {
24f273e5c5SUday Bondhugula
25f273e5c5SUday Bondhugula /// This pass applies the permutation on the first maximal perfect nest.
2680aca1eaSRiver Riddle struct TestLoopPermutation
2787d6bf37SRiver Riddle : public PassWrapper<TestLoopPermutation, OperationPass<>> {
MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID__anonca63a3fa0111::TestLoopPermutation285e50dd04SRiver Riddle MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestLoopPermutation)
295e50dd04SRiver Riddle
30b5e22e6dSMehdi Amini StringRef getArgument() const final { return PASS_NAME; }
getDescription__anonca63a3fa0111::TestLoopPermutation31b5e22e6dSMehdi Amini StringRef getDescription() const final {
32b5e22e6dSMehdi Amini return "Tests affine loop permutation utility";
33b5e22e6dSMehdi Amini }
34f273e5c5SUday Bondhugula TestLoopPermutation() = default;
TestLoopPermutation__anonca63a3fa0111::TestLoopPermutation353bab9d4eSMehdi Amini TestLoopPermutation(const TestLoopPermutation &pass) : PassWrapper(pass){};
36f273e5c5SUday Bondhugula
3741574554SRiver Riddle void runOnOperation() override;
38f273e5c5SUday Bondhugula
39f273e5c5SUday Bondhugula private:
40f273e5c5SUday Bondhugula /// Permutation specifying loop i is mapped to permList[i] in
41f273e5c5SUday Bondhugula /// transformed nest (with i going from outermost to innermost).
42f273e5c5SUday Bondhugula ListOption<unsigned> permList{*this, "permutation-map",
43f273e5c5SUday Bondhugula llvm::cl::desc("Specify the loop permutation"),
446edef135SRiver Riddle llvm::cl::OneOrMore};
45f273e5c5SUday Bondhugula };
46f273e5c5SUday Bondhugula
47be0a7e9fSMehdi Amini } // namespace
48f273e5c5SUday Bondhugula
runOnOperation()4941574554SRiver Riddle void TestLoopPermutation::runOnOperation() {
50f273e5c5SUday Bondhugula
51f273e5c5SUday Bondhugula SmallVector<unsigned, 4> permMap(permList.begin(), permList.end());
525d49511bSHugo Pompougnac
535d49511bSHugo Pompougnac SmallVector<AffineForOp, 2> forOps;
5487d6bf37SRiver Riddle getOperation()->walk([&](AffineForOp forOp) { forOps.push_back(forOp); });
555d49511bSHugo Pompougnac
565d49511bSHugo Pompougnac for (auto forOp : forOps) {
575d49511bSHugo Pompougnac SmallVector<AffineForOp, 6> nest;
585d49511bSHugo Pompougnac // Get the maximal perfect nest.
595d49511bSHugo Pompougnac getPerfectlyNestedLoops(nest, forOp);
605d49511bSHugo Pompougnac // Permute if the nest's size is consistent with the specified
615d49511bSHugo Pompougnac // permutation.
625d49511bSHugo Pompougnac if (nest.size() >= 2 && nest.size() == permMap.size()) {
63f273e5c5SUday Bondhugula permuteLoops(nest, permMap);
64f273e5c5SUday Bondhugula }
655d49511bSHugo Pompougnac }
665d49511bSHugo Pompougnac }
67f273e5c5SUday Bondhugula
68f273e5c5SUday Bondhugula namespace mlir {
registerTestLoopPermutationPass()69f273e5c5SUday Bondhugula void registerTestLoopPermutationPass() {
70b5e22e6dSMehdi Amini PassRegistration<TestLoopPermutation>();
71f273e5c5SUday Bondhugula }
72f273e5c5SUday Bondhugula } // namespace mlir
73