Index: lib/Transforms/Instrumentation/IndirectCallPromotion.cpp =================================================================== --- lib/Transforms/Instrumentation/IndirectCallPromotion.cpp +++ lib/Transforms/Instrumentation/IndirectCallPromotion.cpp @@ -558,7 +558,13 @@ BB->getContext(), "pgo-icall-prom", *BB->getParent(), Inst->getDebugLoc(), Twine("Promote indirect call to ") + DirectCallee->getName() + " with count " + Twine(Count) + " out of " + Twine(TotalCount)); - return NewInst; + + while (NewInst && NewInst->getParent() == DirectCallBB) + if (isa(NewInst)) + return NewInst; + else + NewInst = NewInst->getPrevNode(); + return nullptr; } // Promote indirect-call to conditional direct-call for one callsite. Index: test/Transforms/SampleProfile/indirect-call.ll =================================================================== --- test/Transforms/SampleProfile/indirect-call.ll +++ test/Transforms/SampleProfile/indirect-call.ll @@ -12,16 +12,16 @@ ; CHECK-LABEL: @test_inline ; If the indirect call is promoted and inlined in profile, we should promote and inline it. -define void @test_inline(void ()*) !dbg !3 { - %2 = alloca void ()* - store void ()* %0, void ()** %2 - %3 = load void ()*, void ()** %2 +define void @test_inline(i64* (i32*)*, i32* %x) !dbg !3 { + %2 = alloca i64* (i32*)* + store i64* (i32*)* %0, i64* (i32*)** %2 + %3 = load i64* (i32*)*, i64* (i32*)** %2 ; CHECK: icmp {{.*}} @foo_inline ; CHECK: if.true.direct_targ: ; CHECK-NOT: call ; CHECK: if.false.orig_indirect: ; CHECK: call - call void %3(), !dbg !5 + call i64* %3(i32* %x), !dbg !5 ret void } @@ -37,8 +37,10 @@ ret void } -define void @foo_inline() !dbg !3 { - ret void +@x = global i32 0, align 4 + +define i32* @foo_inline(i32* %x) !dbg !3 { + ret i32* %x } define i32 @foo_noinline(i32 %x) !dbg !3 {