forked from OSchip/llvm-project
Handle profile mismatch correctly for SamplePGO.
Summary: Fix the bug when promoted call return type mismatches with the promoted function, we should not try to inline it. Otherwise it may lead to compiler crash. Reviewers: davidxl, tejohnson, eraman Reviewed By: tejohnson Subscribers: llvm-commits, sanjoy Differential Revision: https://reviews.llvm.org/D38018 llvm-svn: 313658
This commit is contained in:
parent
26fa1bf4da
commit
b6e60c8b80
|
@ -720,7 +720,7 @@ bool SampleProfileLoader::inlineHotFunctions(
|
|||
continue;
|
||||
Instruction *DI = I;
|
||||
if (!CalledFunction && !PromotedInsns.count(I) &&
|
||||
CallSite(I).isIndirectCall())
|
||||
CallSite(I).isIndirectCall()) {
|
||||
for (const auto *FS : findIndirectCallFunctionSamples(*I)) {
|
||||
auto CalleeFunctionName = FS->getName();
|
||||
// If it is a recursive call, we do not inline it as it could bloat
|
||||
|
@ -751,12 +751,17 @@ bool SampleProfileLoader::inlineHotFunctions(
|
|||
continue;
|
||||
}
|
||||
}
|
||||
// If there is profile mismatch, we should not attempt to inline DI.
|
||||
if (!isa<CallInst>(DI) && !isa<InvokeInst>(DI))
|
||||
continue;
|
||||
}
|
||||
if (!CalledFunction || !CalledFunction->getSubprogram()) {
|
||||
findCalleeFunctionSamples(*I)->findImportedFunctions(
|
||||
ImportGUIDs, F.getParent(),
|
||||
Samples->getTotalSamples() * SampleProfileHotThreshold / 100);
|
||||
continue;
|
||||
}
|
||||
assert(isa<CallInst>(DI) || isa<InvokeInst>(DI));
|
||||
CallSite CS(DI);
|
||||
DebugLoc DLoc = I->getDebugLoc();
|
||||
BasicBlock *BB = I->getParent();
|
||||
|
|
|
@ -20,3 +20,6 @@ test_inline_strip_conflict:3000:0
|
|||
test_norecursive_inline:3000:0
|
||||
1: test_norecursive_inline:3000
|
||||
20: 3000
|
||||
test_noinline_bitcast:3000:0
|
||||
1: foo_direct_i32:3000
|
||||
1: 3000
|
||||
|
|
|
@ -69,6 +69,19 @@ define void @test_noinline(void ()*) !dbg !12 {
|
|||
ret void
|
||||
}
|
||||
|
||||
; CHECK-LABEL: @test_noinline_bitcast
|
||||
; If the indirect call has been promoted to a direct call with bitcast,
|
||||
; do not inline it.
|
||||
define float @test_noinline_bitcast(float ()*) !dbg !26 {
|
||||
%2 = alloca float ()*
|
||||
store float ()* %0, float ()** %2
|
||||
; CHECK: icmp
|
||||
; CHECK: call
|
||||
%3 = load float ()*, float ()** %2
|
||||
%4 = call float %3(), !dbg !27
|
||||
ret float %4
|
||||
}
|
||||
|
||||
; CHECK-LABEL: @test_norecursive_inline
|
||||
; If the indirect call target is the caller, we should not promote it.
|
||||
define void @test_norecursive_inline() !dbg !24 {
|
||||
|
@ -114,6 +127,10 @@ define void @foo_direct() !dbg !21 {
|
|||
ret void
|
||||
}
|
||||
|
||||
define i32 @foo_direct_i32() !dbg !28 {
|
||||
ret i32 0;
|
||||
}
|
||||
|
||||
; CHECK-LABEL: @test_direct
|
||||
; We should not promote a direct call.
|
||||
define void @test_direct() !dbg !22 {
|
||||
|
@ -155,3 +172,6 @@ define void @test_direct() !dbg !22 {
|
|||
!23 = !DILocation(line: 23, scope: !22)
|
||||
!24 = distinct !DISubprogram(name: "test_norecursive_inline", scope: !1, file: !1, line: 12, unit: !0)
|
||||
!25 = !DILocation(line: 13, scope: !24)
|
||||
!26 = distinct !DISubprogram(name: "test_noinline_bitcast", scope: !1, file: !1, line: 12, unit: !0)
|
||||
!27 = !DILocation(line: 13, scope: !26)
|
||||
!28 = distinct !DISubprogram(name: "foo_direct_i32", scope: !1, file: !1, line: 11, unit: !0)
|
||||
|
|
Loading…
Reference in New Issue