[flang-commits] [flang] [mlir][Interfaces] `LoopLikeOpInterface`: Add helper to get yielded values (PR #67305)
Matthias Springer via flang-commits
flang-commits at lists.llvm.org
Fri Oct 6 02:56:38 PDT 2023
================
@@ -20,6 +20,19 @@ def LoopLikeOpInterface : OpInterface<"LoopLikeOpInterface"> {
Contains helper functions to query properties and perform transformations
of a loop. Operations that implement this interface will be considered by
loop-invariant code motion.
+
+ Loop-carried variables can be exposed through this interface. There are
+ 3 components to a loop-carried variable.
+ - The "region iter_arg" is the block argument of the entry block that
+ represents the loop-carried variable in each iteration.
+ - The "init value" is an operand of the loop op that serves as the initial
+ region iter_arg value for the first iteration (if any).
+ - The "yielded" value is the value that is forwarded from one iteration to
+ serve as the region iter_arg of the next iteration.
+
+ If one of the respective interface methods is implemented, so must the other
+ two. The interface verifier ensures that the number of types of the region
----------------
matthias-springer wrote:
The problem is if we allow `getInits` without the other two functions, we cannot verify certain invariants anymore (e.g., matching number of yielded values/init operands and their types). And future transformations (I'm planning to add one for "subset hoisting") that operate on arbitrary init-iter_arg-yield style loops will need special casing.
Note, `scf.forall` can still implement the `getDpsInitsMutable()` method, which basically says that the init operand is tied to the OpResult. Maybe that is the abstraction that you are actually interested in?
https://github.com/llvm/llvm-project/pull/67305
More information about the flang-commits
mailing list