[PATCH] D29569: Fix the bug of samplepgo indirect call promption when type casting of the return value is needed.

Dehao Chen via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Feb 6 09:50:26 PST 2017


danielcdh updated this revision to Diff 87245.
danielcdh marked an inline comment as done.
danielcdh added a comment.

update


https://reviews.llvm.org/D29569

Files:
  lib/Transforms/IPO/SampleProfile.cpp
  test/Transforms/SampleProfile/indirect-call.ll


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
+ at 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 {
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<Instruction>(
+              promoteIndirectCall(I, CalledFunction, 80, 100)
+                  ->stripPointerCasts());
           PromotedInsns.insert(I);
         } else {
           DEBUG(dbgs() << "\nFailed to promote indirect call to "


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D29569.87245.patch
Type: text/x-patch
Size: 1854 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170206/a1ee7753/attachment.bin>


More information about the llvm-commits mailing list