From 8887214dfa91e035edf1b1f884651c52b3bd54d4 Mon Sep 17 00:00:00 2001 From: Volodymyr Sapsai Date: Fri, 10 Nov 2017 00:47:47 +0000 Subject: [PATCH] [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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@317853 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/ModuleSummaryAnalysis.cpp | 10 ++++-- ...thinlto-function-summary-callgraph-cast.ll | 31 +++++++++++++++++++ 2 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 test/Bitcode/thinlto-function-summary-callgraph-cast.ll diff --git a/lib/Analysis/ModuleSummaryAnalysis.cpp b/lib/Analysis/ModuleSummaryAnalysis.cpp index 82db09ca97b..8d1e7ee770f 100644 --- a/lib/Analysis/ModuleSummaryAnalysis.cpp +++ b/lib/Analysis/ModuleSummaryAnalysis.cpp @@ -243,6 +243,11 @@ computeFunctionSummary(ModuleSummaryIndex &Index, const Module &M, 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(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(CalledValue)) { @@ -275,9 +280,8 @@ computeFunctionSummary(ModuleSummaryIndex &Index, const Module &M, // Skip inline assembly calls. if (CI && CI->isInlineAsm()) continue; - // Skip direct calls. - if (!CS.getCalledValue() || isa(CS.getCalledValue())) - continue; + assert(CalledValue && !isa(CalledValue) && + "Expected indirect call"); uint32_t NumVals, NumCandidates; uint64_t TotalCount; diff --git a/test/Bitcode/thinlto-function-summary-callgraph-cast.ll b/test/Bitcode/thinlto-function-summary-callgraph-cast.ll new file mode 100644 index 00000000000..b377ba8f00d --- /dev/null +++ b/test/Bitcode/thinlto-function-summary-callgraph-cast.ll @@ -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: +; CHECK-NEXT: +; CHECK-NEXT: + +; 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(...) + +@analias = alias void (...), bitcast (void ()* @aliasee to void (...)*) + +define void @aliasee() { +entry: + ret void +}