MLIR  21.0.0git
RegionUtils.h
Go to the documentation of this file.
1 //===- RegionUtils.h - Region-related transformation utilities --*- C++ -*-===//
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 #ifndef MLIR_TRANSFORMS_REGIONUTILS_H_
10 #define MLIR_TRANSFORMS_REGIONUTILS_H_
11 
12 #include "mlir/IR/Region.h"
13 #include "mlir/IR/Value.h"
14 #include "mlir/IR/ValueRange.h"
15 
16 #include "llvm/ADT/SetVector.h"
17 
18 namespace mlir {
19 class DominanceInfo;
20 class RewriterBase;
21 
22 /// Check if all values in the provided range are defined above the `limit`
23 /// region. That is, if they are defined in a region that is a proper ancestor
24 /// of `limit`.
25 template <typename Range>
26 bool areValuesDefinedAbove(Range values, Region &limit) {
27  for (Value v : values)
28  if (!v.getParentRegion()->isProperAncestor(&limit))
29  return false;
30  return true;
31 }
32 
33 /// Replace all uses of `orig` within the given region with `replacement`.
34 void replaceAllUsesInRegionWith(Value orig, Value replacement, Region &region);
35 
36 /// Calls `callback` for each use of a value within `region` or its descendants
37 /// that was defined at the ancestors of the `limit`.
38 void visitUsedValuesDefinedAbove(Region &region, Region &limit,
39  function_ref<void(OpOperand *)> callback);
40 
41 /// Calls `callback` for each use of a value within any of the regions provided
42 /// that was defined in one of the ancestors.
43 void visitUsedValuesDefinedAbove(MutableArrayRef<Region> regions,
44  function_ref<void(OpOperand *)> callback);
45 
46 /// Fill `values` with a list of values defined at the ancestors of the `limit`
47 /// region and used within `region` or its descendants.
48 void getUsedValuesDefinedAbove(Region &region, Region &limit,
49  SetVector<Value> &values);
50 
51 /// Fill `values` with a list of values used within any of the regions provided
52 /// but defined in one of the ancestors.
53 void getUsedValuesDefinedAbove(MutableArrayRef<Region> regions,
54  SetVector<Value> &values);
55 
56 /// Make a region isolated from above
57 /// - Capture the values that are defined above the region and used within it.
58 /// - Append to the entry block arguments that represent the captured values
59 /// (one per captured value).
60 /// - Replace all uses within the region of the captured values with the
61 /// newly added arguments.
62 /// - `cloneOperationIntoRegion` is a callback that allows caller to specify
63 /// if the operation defining an `OpOperand` needs to be cloned into the
64 /// region. Then the operands of this operation become part of the captured
65 /// values set (unless the operations that define the operands themeselves
66 /// are to be cloned). The cloned operations are added to the entry block
67 /// of the region.
68 /// Return the set of captured values for the operation.
69 SmallVector<Value> makeRegionIsolatedFromAbove(
70  RewriterBase &rewriter, Region &region,
71  llvm::function_ref<bool(Operation *)> cloneOperationIntoRegion =
72  [](Operation *) { return false; });
73 
74 /// Move SSA values used within an operation before an insertion point,
75 /// so that the operation itself (or its replacement) can be moved to
76 /// the insertion point. Current support is only for movement of
77 /// dependencies of `op` before `insertionPoint` in the same basic block.
78 LogicalResult moveOperationDependencies(RewriterBase &rewriter, Operation *op,
79  Operation *insertionPoint,
80  DominanceInfo &dominance);
81 LogicalResult moveOperationDependencies(RewriterBase &rewriter, Operation *op,
82  Operation *insertionPoint);
83 
84 /// Move definitions of `values` before an insertion point. Current support is
85 /// only for movement of definitions within the same basic block. Note that this
86 /// is an all-or-nothing approach. Either definitions of all values are moved
87 /// before insertion point, or none of them are.
88 LogicalResult moveValueDefinitions(RewriterBase &rewriter, ValueRange values,
89  Operation *insertionPoint,
90  DominanceInfo &dominance);
91 LogicalResult moveValueDefinitions(RewriterBase &rewriter, ValueRange values,
92  Operation *insertionPoint);
93 
94 /// Run a set of structural simplifications over the given regions. This
95 /// includes transformations like unreachable block elimination, dead argument
96 /// elimination, as well as some other DCE. This function returns success if any
97 /// of the regions were simplified, failure otherwise. The provided rewriter is
98 /// used to notify callers of operation and block deletion.
99 /// Structurally similar blocks will be merged if the `mergeBlock` argument is
100 /// true. Note this can lead to merged blocks with extra arguments.
101 LogicalResult simplifyRegions(RewriterBase &rewriter,
102  MutableArrayRef<Region> regions,
103  bool mergeBlocks = true);
104 
105 /// Erase the unreachable blocks within the provided regions. Returns success
106 /// if any blocks were erased, failure otherwise.
107 LogicalResult eraseUnreachableBlocks(RewriterBase &rewriter,
108  MutableArrayRef<Region> regions);
109 
110 /// This function returns success if any operations or arguments were deleted,
111 /// failure otherwise.
112 LogicalResult runRegionDCE(RewriterBase &rewriter,
113  MutableArrayRef<Region> regions);
114 
115 } // namespace mlir
116 
117 #endif // MLIR_TRANSFORMS_REGIONUTILS_H_
This class contains a list of basic blocks and a link to the parent operation it is attached to.
Definition: Region.h:26
This class represents an instance of an SSA value in the MLIR system, representing a computable value...
Definition: Value.h:96
Include the generated interface declarations.
llvm::function_ref< Fn > function_ref
Definition: LLVM.h:152
void replaceAllUsesInRegionWith(Value orig, Value replacement, Region &region)
Replace all uses of orig within the given region with replacement.
Definition: RegionUtils.cpp:35
LogicalResult moveOperationDependencies(RewriterBase &rewriter, Operation *op, Operation *insertionPoint, DominanceInfo &dominance)
Move SSA values used within an operation before an insertion point, so that the operation itself (or ...
LogicalResult eraseUnreachableBlocks(RewriterBase &rewriter, MutableArrayRef< Region > regions)
Erase the unreachable blocks within the provided regions.
SmallVector< Value > makeRegionIsolatedFromAbove(RewriterBase &rewriter, Region &region, llvm::function_ref< bool(Operation *)> cloneOperationIntoRegion=[](Operation *) { return false;})
Make a region isolated from above.
Definition: RegionUtils.cpp:87
void getUsedValuesDefinedAbove(Region &region, Region &limit, SetVector< Value > &values)
Fill values with a list of values defined at the ancestors of the limit region and used within region...
Definition: RegionUtils.cpp:70
LogicalResult runRegionDCE(RewriterBase &rewriter, MutableArrayRef< Region > regions)
This function returns success if any operations or arguments were deleted, failure otherwise.
bool areValuesDefinedAbove(Range values, Region &limit)
Check if all values in the provided range are defined above the limit region.
Definition: RegionUtils.h:26
LogicalResult simplifyRegions(RewriterBase &rewriter, MutableArrayRef< Region > regions, bool mergeBlocks=true)
Run a set of structural simplifications over the given regions.
LogicalResult moveValueDefinitions(RewriterBase &rewriter, ValueRange values, Operation *insertionPoint, DominanceInfo &dominance)
Move definitions of values before an insertion point.
void visitUsedValuesDefinedAbove(Region &region, Region &limit, function_ref< void(OpOperand *)> callback)
Calls callback for each use of a value within region or its descendants that was defined at the ances...
Definition: RegionUtils.cpp:43
Represents a range (offset, size, and stride) where each element of the triple may be dynamic or stat...