From: Dehao Chen Date: Mon, 6 Feb 2017 18:10:36 +0000 (+0000) Subject: Fix the bug of samplepgo indirect call promption when type casting of the return... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d2d041f452b0d892a80611e8848eada1f7ecbaf3;p=llvm Fix the bug of samplepgo indirect call promption when type casting of the return value is needed. Summary: When type casting of the return value is needed, promoteIndirectCall will return the type casting instruction instead of the direct call. This patch changed to return the direct call instruction instead. Reviewers: davidxl Reviewed By: davidxl Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D29569 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@294205 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/IPO/SampleProfile.cpp b/lib/Transforms/IPO/SampleProfile.cpp index 50868f42c92..87015272b96 100644 --- a/lib/Transforms/IPO/SampleProfile.cpp +++ b/lib/Transforms/IPO/SampleProfile.cpp @@ -643,7 +643,9 @@ bool SampleProfileLoader::inlineHotFunctions(Function &F) { // 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 " diff --git a/test/Transforms/SampleProfile/indirect-call.ll b/test/Transforms/SampleProfile/indirect-call.ll index 7e43adb905e..c868d0b83a2 100644 --- a/test/Transforms/SampleProfile/indirect-call.ll +++ b/test/Transforms/SampleProfile/indirect-call.ll @@ -12,16 +12,16 @@ define void @test(void ()*) !dbg !3 { ; 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 @@ define void @test_noinline(void ()*) !dbg !3 { 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 {