]> granicus.if.org Git - llvm/commitdiff
Do not inline recursive direct calls in sample loader pass.
authorDehao Chen <dehao@google.com>
Wed, 21 Jun 2017 17:57:43 +0000 (17:57 +0000)
committerDehao Chen <dehao@google.com>
Wed, 21 Jun 2017 17:57:43 +0000 (17:57 +0000)
Summary: r305009 disables recursive inlining for indirect calls in sample loader pass. The same logic applies to direct recursive calls.

Reviewers: iteratee, davidxl

Reviewed By: iteratee

Subscribers: sanjoy, llvm-commits, eraman

Differential Revision: https://reviews.llvm.org/D34456

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@305934 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/IPO/SampleProfile.cpp
test/Transforms/SampleProfile/Inputs/einline.prof
test/Transforms/SampleProfile/early-inline.ll

index 67bc8f5f6b7adb7a348ec4a5b16bec7a4b1c4494..656421ee58df8d8587acd818647a67ddded3d819 100644 (file)
@@ -690,6 +690,9 @@ bool SampleProfileLoader::inlineHotFunctions(
     for (auto I : CIS) {
       InlineFunctionInfo IFI(nullptr, ACT ? &GetAssumptionCache : nullptr);
       Function *CalledFunction = CallSite(I).getCalledFunction();
+      // Do not inline recursive calls.
+      if (CalledFunction == &F)
+        continue;
       Instruction *DI = I;
       if (!CalledFunction && !PromotedInsns.count(I) &&
           CallSite(I).isIndirectCall())
index 90f41d21ca3ba888945e0731dc1e9b3884d6e22a..df0275b50051d04527d79827d41ca0da2de692fb 100644 (file)
@@ -1,3 +1,6 @@
 _Z3foov:200:100
  1: _Z3barv:0
  3: _Z3barv:100
+recursive:200:100
+ 1: recursive:100
+ 2: recursive:100
index 51e7d243c187d7880bcbac0d300e28c53621b2bb..a240635b2b8d34f5d5f3f0db2a238e27a5ac9f00 100644 (file)
@@ -32,6 +32,19 @@ define internal void @_ZL3barv() !dbg !12 {
   ret void
 }
 
+; CHECK-LABEL: @recursive
+define void @recursive() !dbg !13 {
+; Recursive calls should not be early-inlined.
+; CHECK-NOT: call void @recursive
+; CHECK: call void @recursive
+; CHECK: call void @recursive
+; CHECK-NOT: call void @recursive
+; CHECK: ret
+  call void @recursive(), !dbg !14
+  call void @recursive(), !dbg !15
+  ret void
+}
+
 declare i32 @__gxx_personality_v0(...)
 
 !llvm.dbg.cu = !{!0}
@@ -46,3 +59,6 @@ declare i32 @__gxx_personality_v0(...)
 !10 = !DILocation(line: 8, column: 5, scope: !11)
 !11 = distinct !DILexicalBlock(scope: !6, file: !1, line: 7, column: 7)
 !12 = distinct !DISubprogram(linkageName: "_ZL3barv", scope: !1, file: !1, line: 20, scopeLine: 20, unit: !0)
+!13 = distinct !DISubprogram(linkageName: "recursive", scope: !1, file: !1, line: 20, scopeLine: 20, unit: !0)
+!14 = !DILocation(line: 21, column: 3, scope: !13)
+!15 = !DILocation(line: 22, column: 3, scope: !13)