MLIR 22.0.0git
LoopInvariantCodeMotion.cpp
Go to the documentation of this file.
1//===- LoopInvariantCodeMotion.cpp - Code to perform loop fusion-----------===//
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-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements loop invariant code motion.
10//
11//===----------------------------------------------------------------------===//
12
14
18
19namespace mlir {
20#define GEN_PASS_DEF_LOOPINVARIANTCODEMOTION
21#define GEN_PASS_DEF_LOOPINVARIANTSUBSETHOISTING
22#include "mlir/Transforms/Passes.h.inc"
23} // namespace mlir
24
25using namespace mlir;
26
27namespace {
28/// Loop invariant code motion (LICM) pass.
29struct LoopInvariantCodeMotion
30 : public impl::LoopInvariantCodeMotionBase<LoopInvariantCodeMotion> {
31 void runOnOperation() override;
32};
33
34struct LoopInvariantSubsetHoisting
36 LoopInvariantSubsetHoisting> {
37 void runOnOperation() override;
38};
39} // namespace
40
41void LoopInvariantCodeMotion::runOnOperation() {
42 // Walk through all loops in a function in innermost-loop-first order. This
43 // way, we first LICM from the inner loop, and place the ops in
44 // the outer loop, which in turn can be further LICM'ed.
45 getOperation()->walk(
46 [&](LoopLikeOpInterface loopLike) { moveLoopInvariantCode(loopLike); });
47}
48
49void LoopInvariantSubsetHoisting::runOnOperation() {
50 IRRewriter rewriter(getOperation()->getContext());
51 // Walk through all loops in a function in innermost-loop-first order. This
52 // way, we first hoist from the inner loop, and place the ops in the outer
53 // loop, which in turn can be further hoisted from.
54 getOperation()->walk([&](LoopLikeOpInterface loopLike) {
55 (void)hoistLoopInvariantSubsets(rewriter, loopLike);
56 });
57}
58
60 return std::make_unique<LoopInvariantCodeMotion>();
61}
62
64 return std::make_unique<LoopInvariantSubsetHoisting>();
65}
b getContext())
Include the generated interface declarations.
LoopLikeOpInterface hoistLoopInvariantSubsets(RewriterBase &rewriter, LoopLikeOpInterface loopLike)
Hoist loop-invariant tensor subsets (subset extraction and subset insertion ops) from loop-like ops.
std::unique_ptr< Pass > createLoopInvariantCodeMotionPass()
Creates a loop invariant code motion pass that hoists loop invariant instructions out of the loop.
std::unique_ptr< Pass > createLoopInvariantSubsetHoistingPass()
Creates a pass that hoists loop-invariant subset ops.
size_t moveLoopInvariantCode(ArrayRef< Region * > regions, function_ref< bool(Value, Region *)> isDefinedOutsideRegion, function_ref< bool(Operation *, Region *)> shouldMoveOutOfRegion, function_ref< void(Operation *, Region *)> moveOutOfRegion)
Given a list of regions, perform loop-invariant code motion.