1f82d307cSDiego Caballero //===- AffineLoopNormalize.cpp - AffineLoopNormalize Pass -----------------===//
2f82d307cSDiego Caballero //
3f82d307cSDiego Caballero // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4f82d307cSDiego Caballero // See https://llvm.org/LICENSE.txt for license information.
5f82d307cSDiego Caballero // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6f82d307cSDiego Caballero //
7f82d307cSDiego Caballero //===----------------------------------------------------------------------===//
8f82d307cSDiego Caballero //
9f82d307cSDiego Caballero // This file implements a normalizer for affine loop-like ops.
10f82d307cSDiego Caballero //
11f82d307cSDiego Caballero //===----------------------------------------------------------------------===//
12f82d307cSDiego Caballero 
13f82d307cSDiego Caballero #include "PassDetail.h"
14f82d307cSDiego Caballero #include "mlir/Dialect/Affine/IR/AffineOps.h"
15f82d307cSDiego Caballero #include "mlir/Dialect/Affine/Passes.h"
16f82d307cSDiego Caballero #include "mlir/Dialect/Affine/Utils.h"
17f82d307cSDiego Caballero 
18f82d307cSDiego Caballero using namespace mlir;
19f82d307cSDiego Caballero 
20f82d307cSDiego Caballero namespace {
21f82d307cSDiego Caballero 
22f82d307cSDiego Caballero /// Normalize affine.parallel ops so that lower bounds are 0 and steps are 1.
23f82d307cSDiego Caballero /// As currently implemented, this pass cannot fail, but it might skip over ops
24f82d307cSDiego Caballero /// that are already in a normalized form.
25f82d307cSDiego Caballero struct AffineLoopNormalizePass
26f82d307cSDiego Caballero     : public AffineLoopNormalizeBase<AffineLoopNormalizePass> {
27f82d307cSDiego Caballero 
runOnOperation__anon125188a80111::AffineLoopNormalizePass2841574554SRiver Riddle   void runOnOperation() override {
2941574554SRiver Riddle     getOperation().walk([](Operation *op) {
30f82d307cSDiego Caballero       if (auto affineParallel = dyn_cast<AffineParallelOp>(op))
31f82d307cSDiego Caballero         normalizeAffineParallel(affineParallel);
32f82d307cSDiego Caballero       else if (auto affineFor = dyn_cast<AffineForOp>(op))
33f2ff8a8eSUday Bondhugula         (void)normalizeAffineFor(affineFor);
34f82d307cSDiego Caballero     });
35f82d307cSDiego Caballero   }
36f82d307cSDiego Caballero };
37f82d307cSDiego Caballero 
38f82d307cSDiego Caballero } // namespace
39f82d307cSDiego Caballero 
40*58ceae95SRiver Riddle std::unique_ptr<OperationPass<func::FuncOp>>
createAffineLoopNormalizePass()41*58ceae95SRiver Riddle mlir::createAffineLoopNormalizePass() {
42f82d307cSDiego Caballero   return std::make_unique<AffineLoopNormalizePass>();
43f82d307cSDiego Caballero }
44