[llvm] r317853 - [ThinLTO] Fix missing call graph edges for calls with bitcasts.

Volodymyr Sapsai via llvm-commits llvm-commits at lists.llvm.org
Thu Nov 9 16:47:47 PST 2017


Author: vsapsai
Date: Thu Nov  9 16:47:47 2017
New Revision: 317853

URL: http://llvm.org/viewvc/llvm-project?rev=317853&view=rev
Log:
[ThinLTO] Fix missing call graph edges for calls with bitcasts.

This change doesn't fix the root cause of the miscompile PR34966 as the root
cause is in the linker ld64. This change makes call graph more complete
allowing to have better module imports/exports.

rdar://problem/35344706

Reviewers: tejohnson

Reviewed By: tejohnson

Subscribers: mehdi_amini, inglorion, eraman, llvm-commits, hiraditya

Differential Revision: https://reviews.llvm.org/D39356


Added:
    llvm/trunk/test/Bitcode/thinlto-function-summary-callgraph-cast.ll
Modified:
    llvm/trunk/lib/Analysis/ModuleSummaryAnalysis.cpp

Modified: llvm/trunk/lib/Analysis/ModuleSummaryAnalysis.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ModuleSummaryAnalysis.cpp?rev=317853&r1=317852&r2=317853&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/ModuleSummaryAnalysis.cpp (original)
+++ llvm/trunk/lib/Analysis/ModuleSummaryAnalysis.cpp Thu Nov  9 16:47:47 2017
@@ -243,6 +243,11 @@ computeFunctionSummary(ModuleSummaryInde
 
       auto *CalledValue = CS.getCalledValue();
       auto *CalledFunction = CS.getCalledFunction();
+      if (CalledValue && !CalledFunction) {
+        CalledValue = CalledValue->stripPointerCastsNoFollowAliases();
+        // Stripping pointer casts can reveal a called function.
+        CalledFunction = dyn_cast<Function>(CalledValue);
+      }
       // Check if this is an alias to a function. If so, get the
       // called aliasee for the checks below.
       if (auto *GA = dyn_cast<GlobalAlias>(CalledValue)) {
@@ -275,9 +280,8 @@ computeFunctionSummary(ModuleSummaryInde
         // Skip inline assembly calls.
         if (CI && CI->isInlineAsm())
           continue;
-        // Skip direct calls.
-        if (!CS.getCalledValue() || isa<Constant>(CS.getCalledValue()))
-          continue;
+        assert(CalledValue && !isa<Constant>(CalledValue) &&
+               "Expected indirect call");
 
         uint32_t NumVals, NumCandidates;
         uint64_t TotalCount;

Added: llvm/trunk/test/Bitcode/thinlto-function-summary-callgraph-cast.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bitcode/thinlto-function-summary-callgraph-cast.ll?rev=317853&view=auto
==============================================================================
--- llvm/trunk/test/Bitcode/thinlto-function-summary-callgraph-cast.ll (added)
+++ llvm/trunk/test/Bitcode/thinlto-function-summary-callgraph-cast.ll Thu Nov  9 16:47:47 2017
@@ -0,0 +1,31 @@
+; Test to check the callgraph for calls to casts.
+; RUN: opt -module-summary %s -o %t.o
+; RUN: llvm-bcanalyzer -dump %t.o | FileCheck %s
+; PR34966
+
+; CHECK:       <GLOBALVAL_SUMMARY_BLOCK
+; CHECK-NEXT:    <VERSION
+; "op7=1" is a call to "callee" function.
+; CHECK-NEXT:    <PERMODULE {{.*}} op7=1 op8=[[ALIASID:[0-9]+]]/>
+; CHECK-NEXT:    <PERMODULE {{.*}} op0=[[ALIASEEID:[0-9]+]]
+; CHECK-NEXT:    <ALIAS {{.*}} op0=[[ALIASID]] {{.*}} op2=[[ALIASEEID]]/>
+; CHECK-NEXT:  </GLOBALVAL_SUMMARY_BLOCK>
+
+; ModuleID = 'thinlto-function-summary-callgraph-cast.ll'
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+define void @caller() {
+    call void bitcast (void (...)* @callee to void ()*)()
+    call void bitcast (void (...)* @analias to void ()*)()
+    ret void
+}
+
+declare void @callee(...)
+
+ at analias = alias void (...), bitcast (void ()* @aliasee to void (...)*)
+
+define void @aliasee() {
+entry:
+    ret void
+}




More information about the llvm-commits mailing list