//===- RotateWhileLoop.cpp - scf.while loop rotation ----------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // Rotates `scf.while` loops. // //===----------------------------------------------------------------------===// #include "mlir/Dialect/SCF/Transforms/Patterns.h" #include "mlir/Dialect/SCF/IR/SCF.h" using namespace mlir; namespace { struct RotateWhileLoopPattern : OpRewritePattern { using OpRewritePattern::OpRewritePattern; LogicalResult matchAndRewrite(scf::WhileOp whileOp, PatternRewriter &rewriter) const final { // Setting this option would lead to infinite recursion on a greedy driver // as 'do-while' loops wouldn't be skipped. constexpr bool forceCreateCheck = false; FailureOr result = scf::wrapWhileLoopInZeroTripCheck(whileOp, rewriter, forceCreateCheck); // scf::wrapWhileLoopInZeroTripCheck hasn't yet implemented a failure // mechanism. 'do-while' loops are simply returned unmodified. In order to // stop recursion, we check input and output operations differ. return success(succeeded(result) && *result != whileOp); } }; } // namespace namespace mlir { namespace scf { void populateSCFRotateWhileLoopPatterns(RewritePatternSet &patterns) { patterns.add(patterns.getContext()); } } // namespace scf } // namespace mlir