Index: lib/Transforms/IPO/SampleProfile.cpp =================================================================== --- lib/Transforms/IPO/SampleProfile.cpp +++ lib/Transforms/IPO/SampleProfile.cpp @@ -643,7 +643,9 @@ // result, we do not have profile info for the branch probability. // We set the probability to 80% taken to indicate that the static // call is likely taken. - DI = promoteIndirectCall(I, CalledFunction, 80, 100); + DI = dyn_cast( + promoteIndirectCall(I, CalledFunction, 80, 100) + ->stripPointerCasts()); PromotedInsns.insert(I); } else { DEBUG(dbgs() << "\nFailed to promote indirect call to " 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 {