xref: /llvm-project/mlir/test/lib/Dialect/Affine/TestLoopPermutation.cpp (revision 4c48f016effde67d500fc95290096aec9f3bdb70)
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