brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.6 KiB · 8707ec9 Raw
45 lines · cpp
1//===- RotateWhileLoop.cpp - scf.while loop rotation ----------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// Rotates `scf.while` loops.10//11//===----------------------------------------------------------------------===//12 13#include "mlir/Dialect/SCF/Transforms/Patterns.h"14 15#include "mlir/Dialect/SCF/IR/SCF.h"16 17using namespace mlir;18 19namespace {20struct RotateWhileLoopPattern : OpRewritePattern<scf::WhileOp> {21  using OpRewritePattern<scf::WhileOp>::OpRewritePattern;22 23  LogicalResult matchAndRewrite(scf::WhileOp whileOp,24                                PatternRewriter &rewriter) const final {25    // Setting this option would lead to infinite recursion on a greedy driver26    // as 'do-while' loops wouldn't be skipped.27    constexpr bool forceCreateCheck = false;28    FailureOr<scf::WhileOp> result =29        scf::wrapWhileLoopInZeroTripCheck(whileOp, rewriter, forceCreateCheck);30    // scf::wrapWhileLoopInZeroTripCheck hasn't yet implemented a failure31    // mechanism. 'do-while' loops are simply returned unmodified. In order to32    // stop recursion, we check input and output operations differ.33    return success(succeeded(result) && *result != whileOp);34  }35};36} // namespace37 38namespace mlir {39namespace scf {40void populateSCFRotateWhileLoopPatterns(RewritePatternSet &patterns) {41  patterns.add<RotateWhileLoopPattern>(patterns.getContext());42}43} // namespace scf44} // namespace mlir45