From d2d041f452b0d892a80611e8848eada1f7ecbaf3 Mon Sep 17 00:00:00 2001 From: Dehao Chen Date: Mon, 6 Feb 2017 18:10:36 +0000 Subject: [PATCH] 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 --- lib/Transforms/IPO/SampleProfile.cpp | 4 +++- test/Transforms/SampleProfile/indirect-call.ll | 16 +++++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) 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 { -- 2.50.1