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 Bondhugulastatic 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 Bondhugulavoid 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 Bondhugulavoid registerTestAffineWalk() { PassRegistration<TestAffineWalk>(); } 57c1eef483SUday Bondhugula } // namespace mlir 58