[Mlir-commits] [mlir] [mlir][inline] avoid inline self-recursive function (PR #83092)
Congcong Cai
llvmlistbot at llvm.org
Thu Mar 7 04:12:37 PST 2024
https://github.com/HerrCai0907 updated https://github.com/llvm/llvm-project/pull/83092
>From 3c4a0283909cf3c71173177b31523154aa6c9d23 Mon Sep 17 00:00:00 2001
From: Congcong Cai <congcongcai0907 at 163.com>
Date: Thu, 7 Mar 2024 20:12:24 +0800
Subject: [PATCH] [mlir][inline] avoid inline self-recursive function
We cannot get any benifit from inlining self-recursive function. This patch want to detect this cases and ignore it.
---
mlir/lib/Transforms/Utils/Inliner.cpp | 8 +++++++
.../Transforms/inlining-recursive-self.mlir | 22 +++++++++++++++++++
2 files changed, 30 insertions(+)
create mode 100644 mlir/test/Transforms/inlining-recursive-self.mlir
diff --git a/mlir/lib/Transforms/Utils/Inliner.cpp b/mlir/lib/Transforms/Utils/Inliner.cpp
index 74776a73db9aaa..f227cedb269d81 100644
--- a/mlir/lib/Transforms/Utils/Inliner.cpp
+++ b/mlir/lib/Transforms/Utils/Inliner.cpp
@@ -21,6 +21,7 @@
#include "mlir/Support/DebugStringHelper.h"
#include "mlir/Transforms/InliningUtils.h"
#include "llvm/ADT/SCCIterator.h"
+#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/Support/Debug.h"
@@ -711,6 +712,13 @@ bool Inliner::Impl::shouldInline(ResolvedCall &resolvedCall) {
if (resolvedCall.call->hasTrait<OpTrait::IsTerminator>())
return false;
+ // Don't allow inlining if the target is a self-recursive function.
+ if (llvm::count_if(*resolvedCall.targetNode,
+ [&](CallGraphNode::Edge const &edge) -> bool {
+ return edge.getTarget() == resolvedCall.targetNode;
+ }) > 0)
+ return false;
+
// Don't allow inlining if the target is an ancestor of the call. This
// prevents inlining recursively.
Region *callableRegion = resolvedCall.targetNode->getCallableRegion();
diff --git a/mlir/test/Transforms/inlining-recursive-self.mlir b/mlir/test/Transforms/inlining-recursive-self.mlir
new file mode 100644
index 00000000000000..5cc922db8e9786
--- /dev/null
+++ b/mlir/test/Transforms/inlining-recursive-self.mlir
@@ -0,0 +1,22 @@
+// RUN: mlir-opt %s -inline='default-pipeline=''' | FileCheck %s
+// RUN: mlir-opt %s --mlir-disable-threading -inline='default-pipeline=''' | FileCheck %s
+
+// CHECK-LABEL: func.func @b0
+func.func @b0() {
+ // CHECK: call @b0
+ // CHECK-NEXT: call @b1
+ // CHECK-NEXT: call @b0
+ // CHECK-NEXT: call @b1
+ // CHECK-NEXT: call @b0
+ func.call @b0() : () -> ()
+ func.call @b1() : () -> ()
+ func.call @b0() : () -> ()
+ func.call @b1() : () -> ()
+ func.call @b0() : () -> ()
+ return
+}
+func.func @b1() {
+ func.call @b1() : () -> ()
+ func.call @b1() : () -> ()
+ return
+}
More information about the Mlir-commits
mailing list