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;
21f273e5c5SUday Bondhugula 
22f273e5c5SUday Bondhugula namespace {
23f273e5c5SUday Bondhugula 
24f273e5c5SUday Bondhugula /// This pass applies the permutation on the first maximal perfect nest.
2580aca1eaSRiver Riddle struct TestLoopPermutation
2687d6bf37SRiver Riddle     : public PassWrapper<TestLoopPermutation, OperationPass<>> {
MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID__anonf7d818570111::TestLoopPermutation27*5e50dd04SRiver Riddle   MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestLoopPermutation)
28*5e50dd04SRiver Riddle 
29b5e22e6dSMehdi Amini   StringRef getArgument() const final { return PASS_NAME; }
getDescription__anonf7d818570111::TestLoopPermutation30b5e22e6dSMehdi Amini   StringRef getDescription() const final {
31b5e22e6dSMehdi Amini     return "Tests affine loop permutation utility";
32b5e22e6dSMehdi Amini   }
33f273e5c5SUday Bondhugula   TestLoopPermutation() = default;
TestLoopPermutation__anonf7d818570111::TestLoopPermutation343bab9d4eSMehdi Amini   TestLoopPermutation(const TestLoopPermutation &pass) : PassWrapper(pass){};
35f273e5c5SUday Bondhugula 
3641574554SRiver Riddle   void runOnOperation() override;
37f273e5c5SUday Bondhugula 
38f273e5c5SUday Bondhugula private:
39f273e5c5SUday Bondhugula   /// Permutation specifying loop i is mapped to permList[i] in
40f273e5c5SUday Bondhugula   /// transformed nest (with i going from outermost to innermost).
41f273e5c5SUday Bondhugula   ListOption<unsigned> permList{*this, "permutation-map",
42f273e5c5SUday Bondhugula                                 llvm::cl::desc("Specify the loop permutation"),
436edef135SRiver Riddle                                 llvm::cl::OneOrMore};
44f273e5c5SUday Bondhugula };
45f273e5c5SUday Bondhugula 
46be0a7e9fSMehdi Amini } // namespace
47f273e5c5SUday Bondhugula 
runOnOperation()4841574554SRiver Riddle void TestLoopPermutation::runOnOperation() {
49f273e5c5SUday Bondhugula 
50f273e5c5SUday Bondhugula   SmallVector<unsigned, 4> permMap(permList.begin(), permList.end());
515d49511bSHugo Pompougnac 
525d49511bSHugo Pompougnac   SmallVector<AffineForOp, 2> forOps;
5387d6bf37SRiver Riddle   getOperation()->walk([&](AffineForOp forOp) { forOps.push_back(forOp); });
545d49511bSHugo Pompougnac 
555d49511bSHugo Pompougnac   for (auto forOp : forOps) {
565d49511bSHugo Pompougnac     SmallVector<AffineForOp, 6> nest;
575d49511bSHugo Pompougnac     // Get the maximal perfect nest.
585d49511bSHugo Pompougnac     getPerfectlyNestedLoops(nest, forOp);
595d49511bSHugo Pompougnac     // Permute if the nest's size is consistent with the specified
605d49511bSHugo Pompougnac     // permutation.
615d49511bSHugo Pompougnac     if (nest.size() >= 2 && nest.size() == permMap.size()) {
62f273e5c5SUday Bondhugula       permuteLoops(nest, permMap);
63f273e5c5SUday Bondhugula     }
645d49511bSHugo Pompougnac   }
655d49511bSHugo Pompougnac }
66f273e5c5SUday Bondhugula 
67f273e5c5SUday Bondhugula namespace mlir {
registerTestLoopPermutationPass()68f273e5c5SUday Bondhugula void registerTestLoopPermutationPass() {
69b5e22e6dSMehdi Amini   PassRegistration<TestLoopPermutation>();
70f273e5c5SUday Bondhugula }
71f273e5c5SUday Bondhugula } // namespace mlir
72