From 5f67a41bab16b95acc2f5ae2375cb25a1899da7e Mon Sep 17 00:00:00 2001 From: Dehao Chen Date: Wed, 21 Jun 2017 17:57:43 +0000 Subject: [PATCH] Do not inline recursive direct calls in sample loader pass. 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 | 3 +++ .../Transforms/SampleProfile/Inputs/einline.prof | 3 +++ test/Transforms/SampleProfile/early-inline.ll | 16 ++++++++++++++++ 3 files changed, 22 insertions(+) diff --git a/lib/Transforms/IPO/SampleProfile.cpp b/lib/Transforms/IPO/SampleProfile.cpp index 67bc8f5f6b7..656421ee58d 100644 --- a/lib/Transforms/IPO/SampleProfile.cpp +++ b/lib/Transforms/IPO/SampleProfile.cpp @@ -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()) diff --git a/test/Transforms/SampleProfile/Inputs/einline.prof b/test/Transforms/SampleProfile/Inputs/einline.prof index 90f41d21ca3..df0275b5005 100644 --- a/test/Transforms/SampleProfile/Inputs/einline.prof +++ b/test/Transforms/SampleProfile/Inputs/einline.prof @@ -1,3 +1,6 @@ _Z3foov:200:100 1: _Z3barv:0 3: _Z3barv:100 +recursive:200:100 + 1: recursive:100 + 2: recursive:100 diff --git a/test/Transforms/SampleProfile/early-inline.ll b/test/Transforms/SampleProfile/early-inline.ll index 51e7d243c18..a240635b2b8 100644 --- a/test/Transforms/SampleProfile/early-inline.ll +++ b/test/Transforms/SampleProfile/early-inline.ll @@ -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) -- 2.50.1