https://github.com/matthias-springer updated https://github.com/llvm/llvm-project/pull/174978
>From 7787a1d6cd301f9a64bdae51ccb52067e6848bcd Mon Sep 17 00:00:00 2001 From: Matthias Springer <[email protected]> Date: Thu, 8 Jan 2026 12:58:02 +0000 Subject: [PATCH] [mlir][Interfaces] Document that `RegionBranchTerminatorOpInterface` is mandatory --- .../mlir/Interfaces/ControlFlowInterfaces.td | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/mlir/include/mlir/Interfaces/ControlFlowInterfaces.td b/mlir/include/mlir/Interfaces/ControlFlowInterfaces.td index ff99e220c179f..981fe4a18e355 100644 --- a/mlir/include/mlir/Interfaces/ControlFlowInterfaces.td +++ b/mlir/include/mlir/Interfaces/ControlFlowInterfaces.td @@ -127,7 +127,8 @@ def RegionBranchOpInterface : OpInterface<"RegionBranchOpInterface"> { A "region branch point" indicates a point from which a branch originates. It can indicate: - 1. A terminator in any of the immediately nested region of this op. + 1. A `RegionBranchTerminatorOpInterface` terminator in any of the + immediately nested region of this op. 2. `RegionBranchPoint::parent()`: the branch originates from outside of the op, i.e., when first executing this op. @@ -147,6 +148,15 @@ 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: ``` @@ -215,7 +225,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 @@ -379,7 +389,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 region successor. + 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"; _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
