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

llvm-svn: 305934
This commit is contained in:
Dehao Chen 2017-06-21 17:57:43 +00:00
parent d394a5b7a6
commit 6ae666b3ab
3 changed files with 22 additions and 0 deletions

View 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())

View File

@ -1,3 +1,6 @@
_Z3foov:200:100
1: _Z3barv:0
3: _Z3barv:100
recursive:200:100
1: recursive:100
2: recursive:100

View 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)