[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
llvm-svn: 317853
diff --git a/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp b/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp
index 82db09c..8d1e7ee 100644
--- a/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp
+++ b/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp
@@ -243,6 +243,11 @@
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 @@
// 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;