[PATCH] D37176: Create PHI node for the return value only when the return value has uses.

Taewook Oh via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 25 21:12:52 PDT 2017


twoh created this revision.

Currently, a phi node is created in the normal destination to unify the return values from promoted calls and the original indirect call. This patch makes this phi node to be created only when the return value has uses.

This patch is necessary to generate valid code, as compiler crashes with the attached test case without this patch. Without patch, an illegal phi node that has no incoming value from `entry`/`catch` is created in `cleanup` block.


https://reviews.llvm.org/D37176

Files:
  lib/Transforms/Instrumentation/IndirectCallPromotion.cpp
  test/Transforms/PGOProfile/icp_invoke_nouse.ll


Index: test/Transforms/PGOProfile/icp_invoke_nouse.ll
===================================================================
--- /dev/null
+++ test/Transforms/PGOProfile/icp_invoke_nouse.ll
@@ -0,0 +1,69 @@
+; RUN: opt < %s -icp-lto -pgo-icall-prom -S | FileCheck %s --check-prefix=ICP
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+ at _ZTISt9exception = external constant i8*
+ at pfptr = global i32()* null, align 8
+
+define internal i32 @_ZL4bar1v() !PGOFuncName !0 {
+entry:
+  ret i32 100 
+}
+
+; Function Attrs: uwtable
+define i32 @_Z3fooi(i32 %x) local_unnamed_addr personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
+entry:
+  %tobool = icmp eq i32 %x, 0
+  br i1 %tobool, label %if.end, label %cleanup
+
+if.end:                                           ; preds = %entry
+  %fptr = load i32 ()*, i32 ()** @pfptr, align 8
+; ICP:  [[BITCAST_IC1:%[0-9]+]] = bitcast i32 ()* %fptr to i8*
+; ICP:  [[CMP_IC1:%[0-9]+]] = icmp eq i8* [[BITCAST_IC1]], bitcast (i32 ()* @_ZL4bar1v to i8*)
+; ICP:  br i1 [[CMP_IC1]], label %[[TRUE_LABEL_IC1:.*]], label %[[FALSE_LABEL_IC1:.*]], !prof [[BRANCH_WEIGHT:![0-9]+]]
+; ICP:[[TRUE_LABEL_IC1]]:
+; ICP:  invoke i32 @_ZL4bar1v()
+; ICP:          to label %[[DCALL_NORMAL_DEST_IC1:.*]] unwind label %lpad
+; ICP:[[FALSE_LABEL_IC1]]:
+  %call = invoke i32 %fptr()
+          to label %cleanup unwind label %lpad, !prof !1
+
+; ICP:[[DCALL_NORMAL_DEST_IC1]]:
+; ICP:  br label %cleanup
+
+lpad:                                             ; preds = %if.end
+  %0 = landingpad { i8*, i32 }
+          cleanup
+          catch i8* bitcast (i8** @_ZTISt9exception to i8*)
+  %1 = extractvalue { i8*, i32 } %0, 1
+  %2 = tail call i32 @llvm.eh.typeid.for(i8* bitcast (i8** @_ZTISt9exception to i8*))
+  %matches = icmp eq i32 %1, %2
+  br i1 %matches, label %catch, label %ehcleanup
+
+catch:                                            ; preds = %lpad
+  %3 = extractvalue { i8*, i32 } %0, 0
+  %4 = tail call i8* @__cxa_begin_catch(i8* %3)
+  tail call void @__cxa_end_catch()
+  br label %cleanup
+
+cleanup:                                          ; preds = %catch, %if.end, %entry
+; ICP-NOT: %[0-9]+ = phi 
+  ret i32 0
+
+ehcleanup:                                        ; preds = %lpad
+  resume { i8*, i32 } %0
+}
+
+declare i32 @_Z3barv() local_unnamed_addr
+
+declare i32 @__gxx_personality_v0(...)
+
+; Function Attrs: nounwind readnone
+declare i32 @llvm.eh.typeid.for(i8*)
+
+declare i8* @__cxa_begin_catch(i8*) local_unnamed_addr
+
+declare void @__cxa_end_catch() local_unnamed_addr
+
+!0 = !{!"invoke.ll:_ZL4bar1v"}
+!1 = !{!"VP", i32 0, i64 10000, i64 -2732222848796217051, i64 10000}
Index: lib/Transforms/Instrumentation/IndirectCallPromotion.cpp
===================================================================
--- lib/Transforms/Instrumentation/IndirectCallPromotion.cpp
+++ lib/Transforms/Instrumentation/IndirectCallPromotion.cpp
@@ -589,7 +589,8 @@
                               IndirectCallBB, NewInst);
   }
 
-  insertCallRetPHI(Inst, NewInst, DirectCallee);
+  if (!Inst->use_empty())
+    insertCallRetPHI(Inst, NewInst, DirectCallee);
 
   DEBUG(dbgs() << "\n== Basic Blocks After ==\n");
   DEBUG(dbgs() << *BB << *DirectCallBB << *IndirectCallBB << *MergeBB << "\n");


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D37176.112781.patch
Type: text/x-patch
Size: 3315 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170826/e28e5f97/attachment.bin>


More information about the llvm-commits mailing list