Index: lib/Transforms/IPO/SampleProfile.cpp =================================================================== --- lib/Transforms/IPO/SampleProfile.cpp +++ lib/Transforms/IPO/SampleProfile.cpp @@ -720,7 +720,7 @@ 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 @@ continue; } } + // If there is profile mismatch, we should not attempt to inline DI. + if (!isa(DI) && !isa(DI)) + continue; + } if (!CalledFunction || !CalledFunction->getSubprogram()) { findCalleeFunctionSamples(*I)->findImportedFunctions( ImportGUIDs, F.getParent(), Samples->getTotalSamples() * SampleProfileHotThreshold / 100); continue; } + assert(isa(DI) || isa(DI)); CallSite CS(DI); DebugLoc DLoc = I->getDebugLoc(); BasicBlock *BB = I->getParent(); Index: test/Transforms/SampleProfile/Inputs/indirect-call.prof =================================================================== --- test/Transforms/SampleProfile/Inputs/indirect-call.prof +++ test/Transforms/SampleProfile/Inputs/indirect-call.prof @@ -20,3 +20,6 @@ test_norecursive_inline:3000:0 1: test_norecursive_inline:3000 20: 3000 +test_noinline_bitcast:3000:0 + 1: foo_direct_i32:3000 + 1: 3000 Index: test/Transforms/SampleProfile/indirect-call.ll =================================================================== --- test/Transforms/SampleProfile/indirect-call.ll +++ test/Transforms/SampleProfile/indirect-call.ll @@ -69,6 +69,19 @@ 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 @@ 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 @@ !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)