[flang-commits] [flang] [mlir][Interfaces] `LoopLikeOpInterface`: Add helper to get yielded values (PR #67305)

Felix Schneider via flang-commits flang-commits at lists.llvm.org
Fri Oct 6 04:07:10 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
----------------
ubfx wrote:

> we cannot verify certain invariants anymore

Ah, makes sense.

> Note, `scf.forall` can still implement the `getDpsInitsMutable()` method

But what about other "looplike" Ops that don't implement the Dps Interface like `scf.parallel`? I think being able to query the tensor/buffer a `LoopLikeOpInterface` operates on is very useful for loop nest analysis - it tells us that the respective buffer is accessed "tripcount" times, where sometimes it's less important whether that is done sequentially or in parallel in the actual Operation.
So I'm not arguing against this change, it's more about not excluding `forall` and `parallel` from providing buffer information through the Interface

https://github.com/llvm/llvm-project/pull/67305


More information about the flang-commits mailing list