[Mlir-commits] [mlir] [mlir][Interfaces][NFC] Document that `RegionBranchTerminatorOpInterface` is mandatory (PR #174978)
Matthias Springer
llvmlistbot at llvm.org
Sun Jan 11 02:13:54 PST 2026
https://github.com/matthias-springer updated https://github.com/llvm/llvm-project/pull/174978
>From 8e04b6b7efcbae92b239bf0853676a6d50b3976a Mon Sep 17 00:00:00 2001
From: Matthias Springer <me at m-sp.org>
Date: Sun, 11 Jan 2026 10:13:13 +0000
Subject: [PATCH] clarify documentation
---
.../mlir/Interfaces/ControlFlowInterfaces.td | 28 +++++++++++++++----
1 file changed, 23 insertions(+), 5 deletions(-)
diff --git a/mlir/include/mlir/Interfaces/ControlFlowInterfaces.td b/mlir/include/mlir/Interfaces/ControlFlowInterfaces.td
index ecad424e30c75..6c342c97a0fe8 100644
--- a/mlir/include/mlir/Interfaces/ControlFlowInterfaces.td
+++ b/mlir/include/mlir/Interfaces/ControlFlowInterfaces.td
@@ -126,9 +126,10 @@ def RegionBranchOpInterface : OpInterface<"RegionBranchOpInterface"> {
be side-effect free.
A "region branch point" indicates a point from which a branch originates. It
- can indicate either a terminator in any of the immediately nested region of
- this op or `RegionBranchPoint::parent()`. In the latter case, the branch
- originates from outside of the op, i.e., when first executing this op.
+ can indicate either a `RegionBranchTerminatorOpInterface` terminator in any
+ of the immediately nested regions of this op or
+ `RegionBranchPoint::parent()`. In the latter case, the branch originates
+ from outside of the op, i.e., when first executing this op.
A "region successor" indicates the target of a branch. It can indicate
either a region of this op or this op itself. In the former case, the region
@@ -141,6 +142,16 @@ def RegionBranchOpInterface : OpInterface<"RegionBranchOpInterface"> {
results must have the same type. `areTypesCompatible` can be implemented to
allow non-equal types.
+
+ Note: This interface works in conjunction with
+ `RegionBranchTerminatorOpInterface`. All immediately nested block
+ terminators that model branching between regions must implement the
+ `RegionBranchTerminatorOpInterface`. Otherwise, analyses/transformations
+ may miss control flow edges and produce incorrect results. Not every block
+ terminator is necessarily a region branch terminator: e.g., in the presence
+ of unstructured control flow, a block terminator could indicate a branch to
+ a different block within the same region.
+
Example:
```
@@ -206,7 +217,7 @@ def RegionBranchOpInterface : OpInterface<"RegionBranchOpInterface"> {
}]
>,
InterfaceMethod<[{
- Returns the potential region successors when branching from `point`.
+ Returns all potential region successors when branching from `point`.
These are the regions that may be selected during the flow of control.
When `point = RegionBranchPoint::parent()`, this method returns the
@@ -370,7 +381,14 @@ def RegionBranchTerminatorOpInterface :
let description = [{
This interface provides information for branching terminator operations
in the presence of a parent `RegionBranchOpInterface` implementation. It
- specifies which operands are passed to which successor region.
+ acts as a marker for valid region branch points and specifies which
+ operands are passed to which region successor.
+
+ Note: If an operation does not implement the
+ `RegionBranchTerminatorOpInterface`, then that op has no region successors.
+ (However, there may be other block terminators in the same region that
+ implement the `RegionBranchTerminatorOpInterface`, so the enclosing region
+ may have region successors.)
}];
let cppNamespace = "::mlir";
More information about the Mlir-commits
mailing list