[llvm-commits] CVS: llvm/lib/Analysis/DataStructure/DataStructureStats.cpp

Chris Lattner lattner at cs.uiuc.edu
Fri Sep 19 20:21:01 PDT 2003


Changes in directory llvm/lib/Analysis/DataStructure:

DataStructureStats.cpp updated: 1.3 -> 1.4

---
Log message:

Keep track of the number of typed/untyped memory accesses theyre are in the program
VS: ----------------------------------------------------------------------


---
Diffs of the changes:

Index: llvm/lib/Analysis/DataStructure/DataStructureStats.cpp
diff -u llvm/lib/Analysis/DataStructure/DataStructureStats.cpp:1.3 llvm/lib/Analysis/DataStructure/DataStructureStats.cpp:1.4
--- llvm/lib/Analysis/DataStructure/DataStructureStats.cpp:1.3	Wed Feb  5 15:59:56 2003
+++ llvm/lib/Analysis/DataStructure/DataStructureStats.cpp	Fri Sep 19 20:20:46 2003
@@ -1,4 +1,4 @@
-//===- DSGraphStats.cpp - Various statistics for DS Graphs -----*- C++ -*--===//
+//===- DSGraphStats.cpp - Various statistics for DS Graphs ----------------===//
 //
 //===----------------------------------------------------------------------===//
 
@@ -6,7 +6,9 @@
 #include "llvm/Analysis/DSGraph.h"
 #include "llvm/Function.h"
 #include "llvm/iOther.h"
+#include "llvm/iMemory.h"
 #include "llvm/Pass.h"
+#include "llvm/Support/InstVisitor.h"
 #include "Support/Statistic.h"
 #include <vector>
 
@@ -18,9 +20,19 @@
   Statistic<> NumPoolNodes("numpools",
                   "Number of allocation nodes that could be pool allocated");
 
-  class DSGraphStats: public FunctionPass {
-    void countCallees(const Function& F, const DSGraph& tdGraph);
+  // Typed/Untyped memory accesses: If DSA can infer that the types the loads
+  // and stores are accessing are correct (ie, the node has not been collapsed),
+  // increment the appropriate counter.
+  Statistic<> NumTypedMemAccesses("numtypedmemaccesses",
+                                "Number of loads/stores which are fully typed");
+  Statistic<> NumUntypedMemAccesses("numuntypedmemaccesses",
+                                "Number of loads/stores which are untyped");
+
+  class DSGraphStats : public FunctionPass, public InstVisitor<DSGraphStats> {
+    void countCallees(const Function &F);
+    const DSGraph *TDGraph;
 
+    DSNode *getNodeForValue(Value *V);
   public:
     /// Driver functions to compute the Load/Store Dep. Graph per function.
     bool runOnFunction(Function& F);
@@ -31,9 +43,11 @@
       AU.addRequired<TDDataStructures>();
     }
 
+    void visitLoad(LoadInst &LI);
+    void visitStore(StoreInst &SI);
+
     /// Debugging support methods
     void print(std::ostream &O) const { }
-    void dump() const;
   };
 
   static RegisterAnalysis<DSGraphStats> Z("dsstats", "DS Graph Statistics");
@@ -48,43 +62,61 @@
 }
 
 
-void DSGraphStats::countCallees(const Function& F, const DSGraph& tdGraph) {
+void DSGraphStats::countCallees(const Function& F) {
   unsigned numIndirectCalls = 0, totalNumCallees = 0;
 
-  const std::vector<DSCallSite>& callSites = tdGraph.getFunctionCalls();
-  for (unsigned i=0, N = callSites.size(); i < N; ++i)
-    if (isIndirectCallee(callSites[i].getCallInst().getCalledValue()))
-      { // This is an indirect function call
-        std::vector<GlobalValue*> Callees =
-          callSites[i].getCalleeNode()->getGlobals();
-        if (Callees.size() > 0) {
-          totalNumCallees  += Callees.size();
-          ++numIndirectCalls;
-        }
-#ifndef NDEBUG
-        else
-          std::cerr << "WARNING: No callee in Function " << F.getName()
-                      << "at call:\n" << callSites[i].getCallInst();
-#endif
-      }
-
+  const std::vector<DSCallSite> &callSites = TDGraph->getFunctionCalls();
+  for (unsigned i = 0, N = callSites.size(); i != N; ++i)
+    if (isIndirectCallee(callSites[i].getCallInst().getCalledValue())) {
+      // This is an indirect function call
+      const std::vector<GlobalValue*> &Callees =
+        callSites[i].getCalleeNode()->getGlobals();
+      if (Callees.size() > 0) {
+        totalNumCallees  += Callees.size();
+        ++numIndirectCalls;
+      } else
+        std::cerr << "WARNING: No callee in Function " << F.getName()
+                  << "at call:\n" << callSites[i].getCallInst();
+    }
+  
   TotalNumCallees  += totalNumCallees;
   NumIndirectCalls += numIndirectCalls;
-
+  
   if (numIndirectCalls)
     std::cout << "  In function " << F.getName() << ":  "
               << (totalNumCallees / (double) numIndirectCalls)
               << " average callees per indirect call\n";
 }
 
+DSNode *DSGraphStats::getNodeForValue(Value *V) {
+  const DSGraph *G = TDGraph;
+  if (isa<GlobalValue>(V))
+    G = TDGraph->getGlobalsGraph();
 
-bool DSGraphStats::runOnFunction(Function& F) {
-  const DSGraph& tdGraph = getAnalysis<TDDataStructures>().getDSGraph(F);
-  countCallees(F, tdGraph);
-  return true;
+  return G->getNodeForValue(V).getNode();
+}
+
+void DSGraphStats::visitLoad(LoadInst &LI) {
+  if (getNodeForValue(LI.getOperand(0))->isNodeCompletelyFolded()) {
+    NumUntypedMemAccesses++;
+  } else {
+    NumTypedMemAccesses++;
+  }
+}
+
+void DSGraphStats::visitStore(StoreInst &SI) {
+  if (getNodeForValue(SI.getOperand(1))->isNodeCompletelyFolded()) {
+    NumUntypedMemAccesses++;
+  } else {
+    NumTypedMemAccesses++;
+  }
 }
 
-void DSGraphStats::dump() const
-{
-  this->print(std::cerr);
+
+
+bool DSGraphStats::runOnFunction(Function& F) {
+  TDGraph = &getAnalysis<TDDataStructures>().getDSGraph(F);
+  countCallees(F);
+  visit(F);
+  return true;
 }





More information about the llvm-commits mailing list