[llvm] aceaea6 - [Inliner] Mark inlinings stopped with inlining history as noinline
Arthur Eubanks via llvm-commits
llvm-commits at lists.llvm.org
Thu May 25 09:56:04 PDT 2023
Author: Arthur Eubanks
Date: 2023-05-25T09:55:53-07:00
New Revision: aceaea67848efa666a11f329926e8654b4826051
URL: https://github.com/llvm/llvm-project/commit/aceaea67848efa666a11f329926e8654b4826051
DIFF: https://github.com/llvm/llvm-project/commit/aceaea67848efa666a11f329926e8654b4826051.diff
LOG: [Inliner] Mark inlinings stopped with inlining history as noinline
The inline history makes sure that we don't keep inlining due to mutual devirtualization. But this gets forgotten between inliner invocations.
So mark the inlined calls as noinline so we respect previous inline history decisions.
This overlaps with D121084, but they're not redundant since we may not inline completely through a child SCC, but we still want a cost multiplier when that happens.
See discussions in D145516.
Reviewed By: jmorse
Differential Revision: https://reviews.llvm.org/D150989
Added:
llvm/test/Transforms/Inline/inline-history-noinline.ll
Modified:
llvm/lib/Transforms/IPO/Inliner.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/IPO/Inliner.cpp b/llvm/lib/Transforms/IPO/Inliner.cpp
index 01808b3d14fe..3e00aebce372 100644
--- a/llvm/lib/Transforms/IPO/Inliner.cpp
+++ b/llvm/lib/Transforms/IPO/Inliner.cpp
@@ -333,6 +333,9 @@ PreservedAnalyses InlinerPass::run(LazyCallGraph::SCC &InitialC,
LLVM_DEBUG(dbgs() << "Skipping inlining due to history: " << F.getName()
<< " -> " << Callee.getName() << "\n");
setInlineRemark(*CB, "recursive");
+ // Set noinline so that we don't forget this decision across CGSCC
+ // iterations.
+ CB->setIsNoInline();
continue;
}
diff --git a/llvm/test/Transforms/Inline/inline-history-noinline.ll b/llvm/test/Transforms/Inline/inline-history-noinline.ll
new file mode 100644
index 000000000000..742bd25ecd9b
--- /dev/null
+++ b/llvm/test/Transforms/Inline/inline-history-noinline.ll
@@ -0,0 +1,32 @@
+; RUN: opt -passes=inline -S < %s | FileCheck %s
+
+; This will inline @f1 into @a, causing two new calls to @f2, which will get inlined for two calls to @f1.
+; The inline history should stop recursive inlining here, and make sure to mark the inlined calls as noinline so we don't repeat the inlining later on when @a gets inlined into @b.
+
+define internal void @f1(ptr %p) {
+ call void %p(ptr @f1)
+ ret void
+}
+
+define internal void @f2(ptr %p) {
+ call void %p(ptr @f2)
+ call void %p(ptr @f2)
+ ret void
+}
+
+define void @b() {
+; CHECK-LABEL: define void @b() {
+; CHECK-NEXT: call void @f1(ptr @f2) #[[NOINLINE:[0-9]+]]
+; CHECK-NEXT: call void @f1(ptr @f2) #[[NOINLINE]]
+; CHECK-NEXT: ret void
+;
+ call void @a()
+ ret void
+}
+
+define internal void @a() {
+ call void @f1(ptr @f2)
+ ret void
+}
+
+; CHECK: [[NOINLINE]] = { noinline }
More information about the llvm-commits
mailing list