[Mlir-commits] [mlir] 75c1d91 - [mlir][SCF] Implement RegionBranchOpInterface on ExecuteRegionOp
Matthias Springer
llvmlistbot at llvm.org
Wed Mar 16 03:56:29 PDT 2022
Author: Matthias Springer
Date: 2022-03-16T19:55:10+09:00
New Revision: 75c1d9155472e343034da88e35e1c29f8142adc7
URL: https://github.com/llvm/llvm-project/commit/75c1d9155472e343034da88e35e1c29f8142adc7
DIFF: https://github.com/llvm/llvm-project/commit/75c1d9155472e343034da88e35e1c29f8142adc7.diff
LOG: [mlir][SCF] Implement RegionBranchOpInterface on ExecuteRegionOp
This is needed for the BufferDeallocation pass.
Differential Revision: https://reviews.llvm.org/D121526
Added:
Modified:
mlir/include/mlir/Dialect/SCF/SCFOps.td
mlir/lib/Dialect/SCF/SCF.cpp
Removed:
################################################################################
diff --git a/mlir/include/mlir/Dialect/SCF/SCFOps.td b/mlir/include/mlir/Dialect/SCF/SCFOps.td
index b9cb09de04ea8..929a4320437db 100644
--- a/mlir/include/mlir/Dialect/SCF/SCFOps.td
+++ b/mlir/include/mlir/Dialect/SCF/SCFOps.td
@@ -56,7 +56,8 @@ def ConditionOp : SCF_Op<"condition", [
// ExecuteRegionOp
//===----------------------------------------------------------------------===//
-def ExecuteRegionOp : SCF_Op<"execute_region"> {
+def ExecuteRegionOp : SCF_Op<"execute_region", [
+ DeclareOpInterfaceMethods<RegionBranchOpInterface>]> {
let summary = "operation that executes its region exactly once";
let description = [{
The `execute_region` operation is used to allow multiple blocks within SCF
diff --git a/mlir/lib/Dialect/SCF/SCF.cpp b/mlir/lib/Dialect/SCF/SCF.cpp
index 4e7ff0829c8d0..e025cf6d831f4 100644
--- a/mlir/lib/Dialect/SCF/SCF.cpp
+++ b/mlir/lib/Dialect/SCF/SCF.cpp
@@ -236,6 +236,24 @@ void ExecuteRegionOp::getCanonicalizationPatterns(RewritePatternSet &results,
results.add<SingleBlockExecuteInliner, MultiBlockExecuteInliner>(context);
}
+/// Given the region at `index`, or the parent operation if `index` is None,
+/// return the successor regions. These are the regions that may be selected
+/// during the flow of control. `operands` is a set of optional attributes that
+/// correspond to a constant value for each operand, or null if that operand is
+/// not a constant.
+void ExecuteRegionOp::getSuccessorRegions(
+ Optional<unsigned> index, ArrayRef<Attribute> operands,
+ SmallVectorImpl<RegionSuccessor> ®ions) {
+ // If the predecessor is the ExecuteRegionOp, branch into the body.
+ if (!index.hasValue()) {
+ regions.push_back(RegionSuccessor(&getRegion()));
+ return;
+ }
+
+ // Otherwise, the region branches back to the parent operation.
+ regions.push_back(RegionSuccessor(getResults()));
+}
+
//===----------------------------------------------------------------------===//
// ConditionOp
//===----------------------------------------------------------------------===//
More information about the Mlir-commits
mailing list