[llvm] f0e6ec1 - [Inliner] Respect noinline call site attribute
Dávid Bolvanský via llvm-commits
llvm-commits at lists.llvm.org
Mon Feb 14 09:35:58 PST 2022
Author: Dávid Bolvanský
Date: 2022-02-14T18:35:52+01:00
New Revision: f0e6ec1547d40da07bcdccb0acc2eb7b2bd4ffd4
URL: https://github.com/llvm/llvm-project/commit/f0e6ec1547d40da07bcdccb0acc2eb7b2bd4ffd4
DIFF: https://github.com/llvm/llvm-project/commit/f0e6ec1547d40da07bcdccb0acc2eb7b2bd4ffd4.diff
LOG: [Inliner] Respect noinline call site attribute
```
always_inline foo() { }
bar () {
noinline foo();
}
```
We should prefer call site attribute over attribute on decl.
Related to https://reviews.llvm.org/D119061
Reviewed By: aeubanks
Differential Revision: https://reviews.llvm.org/D119579
Added:
llvm/test/Transforms/Inline/call-site-attrs.ll
Modified:
llvm/lib/Analysis/InlineCost.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Analysis/InlineCost.cpp b/llvm/lib/Analysis/InlineCost.cpp
index 5333626e3cf8f..2a1a976226047 100644
--- a/llvm/lib/Analysis/InlineCost.cpp
+++ b/llvm/lib/Analysis/InlineCost.cpp
@@ -2864,6 +2864,9 @@ Optional<InlineResult> llvm::getAttributeBasedInliningDecision(
// Calls to functions with always-inline attributes should be inlined
// whenever possible.
if (Call.hasFnAttr(Attribute::AlwaysInline)) {
+ if (Call.getAttributes().hasFnAttr(Attribute::NoInline))
+ return InlineResult::failure("noinline call site attribute");
+
auto IsViable = isInlineViable(*Callee);
if (IsViable.isSuccess())
return InlineResult::success();
diff --git a/llvm/test/Transforms/Inline/call-site-attrs.ll b/llvm/test/Transforms/Inline/call-site-attrs.ll
new file mode 100644
index 0000000000000..50af344a4c71b
--- /dev/null
+++ b/llvm/test/Transforms/Inline/call-site-attrs.ll
@@ -0,0 +1,59 @@
+; RUN: opt < %s -inline -S | FileCheck %s
+; RUN: opt < %s -passes='cgscc(inline)' -S | FileCheck %s
+
+; Always prefer call site attribute over function attribute
+
+define internal i32 @inner1() {
+; CHECK: @inner1(
+ ret i32 1
+}
+
+define i32 @outer1() {
+; CHECK-LABEL: @outer1(
+; CHECK: call
+
+ %r = call i32 @inner1() noinline
+ ret i32 %r
+}
+
+define internal i32 @inner2() alwaysinline {
+; CHECK: @inner2(
+ ret i32 1
+}
+
+define i32 @outer2() {
+; CHECK-LABEL: @outer2(
+; CHECK: call
+
+ %r = call i32 @inner2() noinline
+ ret i32 %r
+}
+
+define i32 @inner3() alwaysinline {
+; CHECK: @inner3(
+ ret i32 1
+}
+
+define i32 @outer3() {
+; CHECK-LABEL: @outer3(
+; CHECK: call
+
+ %r = call i32 @inner3() noinline
+ ret i32 %r
+}
+
+define i32 @inner4() noinline {
+; CHECK: @inner4(
+ ret i32 1
+}
+
+define i32 @outer4() {
+; CHECK-LABEL: @outer4(
+; CHECK-NOT: call
+; CHECK: ret
+
+ %r = call i32 @inner4() alwaysinline
+
+ ret i32 %r
+}
+
More information about the llvm-commits
mailing list