[Mlir-commits] [mlir] [mlir][Interfaces][NFC] Better documentation for `RegionBranchOpInterface` (PR #66920)
Markus Böck
llvmlistbot at llvm.org
Wed Sep 20 08:52:37 PDT 2023
================
@@ -117,27 +117,58 @@ def BranchOpInterface : OpInterface<"BranchOpInterface"> {
def RegionBranchOpInterface : OpInterface<"RegionBranchOpInterface"> {
let description = [{
- This interface provides information for region operations that contain
- branching behavior between held regions, i.e. this interface allows for
+ This interface provides information for region operations that exhibit
+ branching behavior between held regions. I.e., this interface allows for
expressing control flow information for region holding operations.
- This interface is meant to model well-defined cases of control-flow of
+ This interface is meant to model well-defined cases of control-flow and
value propagation, where what occurs along control-flow edges is assumed to
- be side-effect free. For example, corresponding successor operands and
- successor block arguments may have different types. In such cases,
- `areTypesCompatible` can be implemented to compare types along control-flow
- edges. By default, type equality is used.
+ be side-effect free.
+
+ A "region branch point" indicates a point from which a branch originates. It
+ can indicate either a region of this op or `RegionBranchPoint::parent()`. In
+ the latter case, the branch originates from outside of 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. In the former case, the region
+ successor is a region pointer and a range of block arguments to which the
+ "successor operands" are forwarded to. In the latter case, the control flow
+ leaves this op and the region successor is a range of results of this op to
+ which the successor operands are forwarded to.
+
+ By default, successor operands and successor block arguments/successor
+ results must have the same type. `areTypesCompatible` can be implemented to
+ allow non-equal types.
+
+ Example:
+
+ ```
+ %r = scf.for %iv = %lb to %ub step %step iter_args(%a = %b)
+ -> tensor<5xf32> {
+ ...
+ scf.yield %c : tensor<5xf32>
+ }
+ ```
+
+ `scf.if` has one region. The region has two region successors: the region
+ itself and the `scf.if` op. %b is an entry successor operand. %c is a
+ successor operand. %a is a successor block argument. %r is a successor
+ result.
----------------
zero9178 wrote:
```suggestion
`scf.for` has one region. The region has two region successors: the region
itself and the `scf.for` op. %b is an entry successor operand. %c is a
successor operand. %a is a successor block argument. %r is a successor
result.
```
https://github.com/llvm/llvm-project/pull/66920
More information about the Mlir-commits
mailing list