OSDN Git Service

Add hack to only consider indirect calls indirect if they do more than cast
authorChris Lattner <sabre@nondot.org>
Sun, 17 Nov 2002 22:17:12 +0000 (22:17 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 17 Nov 2002 22:17:12 +0000 (22:17 +0000)
their source function

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4723 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/DataStructure/DataStructureStats.cpp

index 1548bc5..36d060e 100644 (file)
@@ -11,7 +11,7 @@
 #include <vector>
 
 namespace {
-  Statistic<double> 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<DSGraphStats> Z("dsstats", "DS Graph Statistics");
 }
 
+static bool isIndirectCallee(Value *V) {
+  if (isa<Function>(V)) return false;
+
+  if (CastInst *CI = dyn_cast<CastInst>(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<DSCallSite>& 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<GlobalValue*> 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";
 }