From ed806bf9fc40e9b8abfd0de78c769eda02ee32eb Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 17 Nov 2002 22:17:12 +0000 Subject: [PATCH] Add hack to only consider indirect calls indirect if they do more than cast their source function git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4723 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../DataStructure/DataStructureStats.cpp | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/lib/Analysis/DataStructure/DataStructureStats.cpp b/lib/Analysis/DataStructure/DataStructureStats.cpp index 1548bc50d7d..36d060edd56 100644 --- a/lib/Analysis/DataStructure/DataStructureStats.cpp +++ b/lib/Analysis/DataStructure/DataStructureStats.cpp @@ -11,7 +11,7 @@ #include namespace { - Statistic TotalNumCallees("totalcallees", + Statistic<> TotalNumCallees("totalcallees", "Total number of callee functions at all indirect call sites"); Statistic<> NumIndirectCalls("numindirect", "Total number of indirect call sites in the program"); @@ -39,6 +39,14 @@ namespace { static RegisterAnalysis Z("dsstats", "DS Graph Statistics"); } +static bool isIndirectCallee(Value *V) { + if (isa(V)) return false; + + if (CastInst *CI = dyn_cast(V)) + return isIndirectCallee(CI->getOperand(0)); + return true; +} + void DSGraphStats::countCallees(const Function& F, const DSGraph& tdGraph) @@ -47,7 +55,7 @@ void DSGraphStats::countCallees(const Function& F, const std::vector& callSites = tdGraph.getFunctionCalls(); for (unsigned i=0, N = callSites.size(); i < N; ++i) - if (callSites[i].getCallInst().getCalledFunction() == NULL) + if (isIndirectCallee(callSites[i].getCallInst().getCalledValue())) { // This is an indirect function call std::vector Callees = callSites[i].getCallee().getNode()->getGlobals(); @@ -66,10 +74,10 @@ void DSGraphStats::countCallees(const Function& F, TotalNumCallees += totalNumCallees; NumIndirectCalls += numIndirectCalls; - std::cout << " In function " << F.getName() << " : " - << (double) (numIndirectCalls == 0? 0.0 - : (totalNumCallees / (double) numIndirectCalls)) - << " avg. callees per indirect call\n"; + if (numIndirectCalls) + std::cout << " In function " << F.getName() << ": " + << (totalNumCallees / (double) numIndirectCalls) + << " average callees per indirect call\n"; }