[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 08:46:22 PST 2017


danielcdh updated this revision to Diff 87239.
danielcdh added a comment.

update to include InvokeInst too.


https://reviews.llvm.org/D29569

Files:
  lib/Transforms/Instrumentation/IndirectCallPromotion.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/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<CallInst>(NewInst) || isa<InvokeInst>(NewInst))
+      return NewInst;
+    else
+      NewInst = NewInst->getPrevNode();
+  return nullptr;
 }
 
 // Promote indirect-call to conditional direct-call for one callsite.


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


More information about the llvm-commits mailing list