[PATCH] D41489: [ThinLTO] Don't try to import noinline functions

Eugene Leviant via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 21 05:57:44 PST 2017


evgeny777 created this revision.
evgeny777 added reviewers: mehdi_amini, tejohnson.
Herald added subscribers: eraman, inglorion.

In the attached test case attempt to import function `foo` causes promotion of function `bar`, which prevents inlining it on codegen phase.


Repository:
  rL LLVM

https://reviews.llvm.org/D41489

Files:
  lib/Analysis/ModuleSummaryAnalysis.cpp
  test/ThinLTO/X86/Inputs/noinline.ll
  test/ThinLTO/X86/noinline.ll


Index: test/ThinLTO/X86/noinline.ll
===================================================================
--- test/ThinLTO/X86/noinline.ll
+++ test/ThinLTO/X86/noinline.ll
@@ -0,0 +1,25 @@
+; This test checks that ThinLTO doesn't try to import noinline function
+; which, when takes place, causes promotion of its callee.
+; RUN: opt -module-summary %s -o %t1.bc
+; RUN: opt -module-summary %p/Inputs/noinline.ll -o %t2.bc
+; RUN: llvm-lto2 run %t1.bc %t2.bc -o %t3.o \
+; RUN:   -r=%t1.bc,main,px \
+; RUN:   -r=%t1.bc,foo,    \
+; RUN:   -r=%t2.bc,foo,p
+; RUN: llvm-nm %t3.o.2 | FileCheck %s
+
+; CHECK-NOT: bar
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-pc-linux-gnu"
+
+; Function Attrs: nounwind ssp uwtable
+define i32 @main(i32, i8** nocapture readnone) local_unnamed_addr #0 {
+  %3 = tail call i32 @foo(i32 %0) #2
+  ret i32 %3
+}
+
+declare i32 @foo(i32) local_unnamed_addr
+
+attributes #0 = { nounwind }
+attributes #2 = { nounwind }
Index: test/ThinLTO/X86/Inputs/noinline.ll
===================================================================
--- test/ThinLTO/X86/Inputs/noinline.ll
+++ test/ThinLTO/X86/Inputs/noinline.ll
@@ -0,0 +1,15 @@
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-pc-linux-gnu"
+
+define i32 @foo(i32) local_unnamed_addr #0 {
+  %2 = tail call fastcc i32 @bar(i32 %0)
+  ret i32 %2
+}
+
+define internal fastcc i32 @bar(i32) unnamed_addr {
+  %2 = shl i32 %0, 1
+  %3 = add nsw i32 %2, 10
+  ret i32 %3
+}
+
+attributes #0 = { noinline }
Index: lib/Analysis/ModuleSummaryAnalysis.cpp
===================================================================
--- lib/Analysis/ModuleSummaryAnalysis.cpp
+++ lib/Analysis/ModuleSummaryAnalysis.cpp
@@ -321,6 +321,8 @@
       TypeTestAssumeVCalls.takeVector(), TypeCheckedLoadVCalls.takeVector(),
       TypeTestAssumeConstVCalls.takeVector(),
       TypeCheckedLoadConstVCalls.takeVector());
+  if (F.getAttributes().hasFnAttribute(Attribute::NoInline))
+    FuncSummary->setNotEligibleToImport();
   if (NonRenamableLocal)
     CantBePromoted.insert(F.getGUID());
   Index.addGlobalValueSummary(F.getName(), std::move(FuncSummary));


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D41489.127870.patch
Type: text/x-patch
Size: 2194 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171221/e5bac223/attachment.bin>


More information about the llvm-commits mailing list