[llvm-branch-commits] [mlir] [mlir][IR] Add listener notifications for pattern begin/end (PR #84131)

Matthias Springer via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Thu Mar 7 22:58:33 PST 2024


================
@@ -68,9 +68,9 @@ class PatternApplicator {
   ///            invalidate the match and try another pattern.
   LogicalResult
   matchAndRewrite(Operation *op, PatternRewriter &rewriter,
-                  function_ref<bool(const Pattern &)> canApply = {},
-                  function_ref<void(const Pattern &)> onFailure = {},
-                  function_ref<LogicalResult(const Pattern &)> onSuccess = {});
+                  std::function<bool(const Pattern &)> canApply = {},
+                  std::function<void(const Pattern &)> onFailure = {},
+                  std::function<LogicalResult(const Pattern &)> onSuccess = {});
----------------
matthias-springer wrote:

What are you referring to with `this function`?

The problem here is really just caused by the fact that the `canApply =` assignment is inside of a nested scope. And the lambda object is dead by the time `matcher.matchAndRewrite` is called. I.e., the `canApply` function_ref points to an already free'd lambda. At least that's my understanding.

What's the C++ guidelines wrt. to `function` vs. `function_ref`. This is the first time I ran into such an issue, and assigning lambdas to `function_ref` feels "dangerous" to me now. When using `function`, I don't have to think about the lifetime of an object.


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


More information about the llvm-branch-commits mailing list