xref: /llvm-project/mlir/test/lib/IR/TestAffineWalk.cpp (revision a5757c5b65f1894de16f549212b1c37793312703)
1c1eef483SUday Bondhugula //===- TestAffineWalk.cpp - Pass to test affine walks
2c1eef483SUday Bondhugula //----------------------===//
3c1eef483SUday Bondhugula //
4c1eef483SUday Bondhugula // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5c1eef483SUday Bondhugula // See https://llvm.org/LICENSE.txt for license information.
6c1eef483SUday Bondhugula // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7c1eef483SUday Bondhugula //
8c1eef483SUday Bondhugula //===----------------------------------------------------------------------===//
9c1eef483SUday Bondhugula 
10c1eef483SUday Bondhugula #include "mlir/Pass/Pass.h"
11c1eef483SUday Bondhugula 
12c1eef483SUday Bondhugula #include "mlir/IR/BuiltinOps.h"
13c1eef483SUday Bondhugula 
14c1eef483SUday Bondhugula using namespace mlir;
15c1eef483SUday Bondhugula 
16c1eef483SUday Bondhugula namespace {
17c1eef483SUday Bondhugula /// A test pass for verifying walk interrupts.
18c1eef483SUday Bondhugula struct TestAffineWalk
19c1eef483SUday Bondhugula     : public PassWrapper<TestAffineWalk, OperationPass<ModuleOp>> {
20c1eef483SUday Bondhugula   MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestAffineWalk)
21c1eef483SUday Bondhugula 
22c1eef483SUday Bondhugula   void runOnOperation() override;
getArgument__anon633d728d0111::TestAffineWalk23c1eef483SUday Bondhugula   StringRef getArgument() const final { return "test-affine-walk"; }
getDescription__anon633d728d0111::TestAffineWalk24c1eef483SUday Bondhugula   StringRef getDescription() const final { return "Test affine walk method."; }
25c1eef483SUday Bondhugula };
26c1eef483SUday Bondhugula } // namespace
27c1eef483SUday Bondhugula 
28c1eef483SUday Bondhugula /// Emits a remark for the first `map`'s result expression that contains a
29c1eef483SUday Bondhugula /// mod expression.
checkMod(AffineMap map,Location loc)30c1eef483SUday Bondhugula static void checkMod(AffineMap map, Location loc) {
31c1eef483SUday Bondhugula   for (AffineExpr e : map.getResults()) {
32c1eef483SUday Bondhugula     e.walk([&](AffineExpr s) {
33c1eef483SUday Bondhugula       if (s.getKind() == mlir::AffineExprKind::Mod) {
34c1eef483SUday Bondhugula         emitRemark(loc, "mod expression: ");
35c1eef483SUday Bondhugula         return WalkResult::interrupt();
36c1eef483SUday Bondhugula       }
37c1eef483SUday Bondhugula       return WalkResult::advance();
38c1eef483SUday Bondhugula     });
39c1eef483SUday Bondhugula   }
40c1eef483SUday Bondhugula }
41c1eef483SUday Bondhugula 
runOnOperation()42c1eef483SUday Bondhugula void TestAffineWalk::runOnOperation() {
43c1eef483SUday Bondhugula   auto m = getOperation();
44c1eef483SUday Bondhugula   // Test whether the walk is being correctly interrupted.
45c1eef483SUday Bondhugula   m.walk([](Operation *op) {
46c1eef483SUday Bondhugula     for (NamedAttribute attr : op->getAttrs()) {
47*a5757c5bSChristian Sigg       auto mapAttr = dyn_cast<AffineMapAttr>(attr.getValue());
48c1eef483SUday Bondhugula       if (!mapAttr)
49c1eef483SUday Bondhugula         return;
50c1eef483SUday Bondhugula       checkMod(mapAttr.getAffineMap(), op->getLoc());
51c1eef483SUday Bondhugula     }
52c1eef483SUday Bondhugula   });
53c1eef483SUday Bondhugula }
54c1eef483SUday Bondhugula 
55c1eef483SUday Bondhugula namespace mlir {
registerTestAffineWalk()56c1eef483SUday Bondhugula void registerTestAffineWalk() { PassRegistration<TestAffineWalk>(); }
57c1eef483SUday Bondhugula } // namespace mlir
58