blob: 4986550a1bce7452ba5919496f14c581667a70c9 [file] [log] [blame]
Chris Lattner4dabb2c2004-07-07 06:32:21 +00001//===- DataStructureStats.cpp - Various statistics for DS Graphs ----------===//
Misha Brukman2b37d7c2005-04-21 21:13:18 +00002//
John Criswellb576c942003-10-20 19:43:21 +00003// The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
Misha Brukman2b37d7c2005-04-21 21:13:18 +00007//
John Criswellb576c942003-10-20 19:43:21 +00008//===----------------------------------------------------------------------===//
Vikram S. Adve586aa3c2002-11-13 15:41:00 +00009//
Chris Lattner4dabb2c2004-07-07 06:32:21 +000010// This file defines a little pass that prints out statistics for DS Graphs.
11//
Vikram S. Adve586aa3c2002-11-13 15:41:00 +000012//===----------------------------------------------------------------------===//
13
Chris Lattner4dabb2c2004-07-07 06:32:21 +000014#include "llvm/Analysis/DataStructure/DataStructure.h"
15#include "llvm/Analysis/DataStructure/DSGraph.h"
Vikram S. Adve586aa3c2002-11-13 15:41:00 +000016#include "llvm/Function.h"
Misha Brukmand8e1eea2004-07-29 17:05:13 +000017#include "llvm/Instructions.h"
Vikram S. Adve586aa3c2002-11-13 15:41:00 +000018#include "llvm/Pass.h"
Chris Lattner78925492003-09-20 01:20:46 +000019#include "llvm/Support/InstVisitor.h"
Reid Spencer551ccae2004-09-01 22:55:40 +000020#include "llvm/ADT/Statistic.h"
Vikram S. Adve586aa3c2002-11-13 15:41:00 +000021#include <vector>
Chris Lattner9a927292003-11-12 23:11:14 +000022using namespace llvm;
Brian Gaeked0fde302003-11-11 22:41:34 +000023
Vikram S. Adve586aa3c2002-11-13 15:41:00 +000024namespace {
Chris Lattnered806bf2002-11-17 22:17:12 +000025 Statistic<> TotalNumCallees("totalcallees",
Vikram S. Adve586aa3c2002-11-13 15:41:00 +000026 "Total number of callee functions at all indirect call sites");
27 Statistic<> NumIndirectCalls("numindirect",
28 "Total number of indirect call sites in the program");
29 Statistic<> NumPoolNodes("numpools",
30 "Number of allocation nodes that could be pool allocated");
31
Chris Lattner78925492003-09-20 01:20:46 +000032 // Typed/Untyped memory accesses: If DSA can infer that the types the loads
33 // and stores are accessing are correct (ie, the node has not been collapsed),
34 // increment the appropriate counter.
35 Statistic<> NumTypedMemAccesses("numtypedmemaccesses",
36 "Number of loads/stores which are fully typed");
37 Statistic<> NumUntypedMemAccesses("numuntypedmemaccesses",
38 "Number of loads/stores which are untyped");
Vikram S. Adve586aa3c2002-11-13 15:41:00 +000039
Chris Lattner78925492003-09-20 01:20:46 +000040 class DSGraphStats : public FunctionPass, public InstVisitor<DSGraphStats> {
41 void countCallees(const Function &F);
42 const DSGraph *TDGraph;
43
44 DSNode *getNodeForValue(Value *V);
Chris Lattner192cd9c2003-09-20 16:12:57 +000045 bool isNodeForValueCollapsed(Value *V);
Vikram S. Adve586aa3c2002-11-13 15:41:00 +000046 public:
47 /// Driver functions to compute the Load/Store Dep. Graph per function.
48 bool runOnFunction(Function& F);
49
50 /// getAnalysisUsage - This modify nothing, and uses the Top-Down Graph.
51 void getAnalysisUsage(AnalysisUsage &AU) const {
52 AU.setPreservesAll();
53 AU.addRequired<TDDataStructures>();
54 }
55
Chris Lattner78925492003-09-20 01:20:46 +000056 void visitLoad(LoadInst &LI);
57 void visitStore(StoreInst &SI);
58
Vikram S. Adve586aa3c2002-11-13 15:41:00 +000059 /// Debugging support methods
Reid Spencerce9653c2004-12-07 04:03:45 +000060 void print(std::ostream &O, const Module* = 0) const { }
Vikram S. Adve586aa3c2002-11-13 15:41:00 +000061 };
62
63 static RegisterAnalysis<DSGraphStats> Z("dsstats", "DS Graph Statistics");
64}
65
Chris Lattner6d796232005-10-24 00:38:38 +000066FunctionPass *llvm::createDataStructureStatsPass() {
67 return new DSGraphStats();
68}
69
70
Chris Lattnered806bf2002-11-17 22:17:12 +000071static bool isIndirectCallee(Value *V) {
72 if (isa<Function>(V)) return false;
73
74 if (CastInst *CI = dyn_cast<CastInst>(V))
75 return isIndirectCallee(CI->getOperand(0));
76 return true;
77}
78
Vikram S. Adve586aa3c2002-11-13 15:41:00 +000079
Chris Lattner78925492003-09-20 01:20:46 +000080void DSGraphStats::countCallees(const Function& F) {
Vikram S. Adve586aa3c2002-11-13 15:41:00 +000081 unsigned numIndirectCalls = 0, totalNumCallees = 0;
82
Chris Lattnera9548d92005-01-30 23:51:02 +000083 for (DSGraph::fc_iterator I = TDGraph->fc_begin(), E = TDGraph->fc_end();
Misha Brukman2b37d7c2005-04-21 21:13:18 +000084 I != E; ++I)
Chris Lattnera9548d92005-01-30 23:51:02 +000085 if (isIndirectCallee(I->getCallSite().getCalledValue())) {
Chris Lattner78925492003-09-20 01:20:46 +000086 // This is an indirect function call
Chris Lattner977b7052005-03-20 02:40:27 +000087 std::vector<Function*> Callees;
88 I->getCalleeNode()->addFullFunctionList(Callees);
89
Chris Lattner78925492003-09-20 01:20:46 +000090 if (Callees.size() > 0) {
91 totalNumCallees += Callees.size();
92 ++numIndirectCalls;
93 } else
Chris Lattner808a7ae2003-09-20 16:34:13 +000094 std::cerr << "WARNING: No callee in Function '" << F.getName()
95 << "' at call: \n"
Chris Lattnera9548d92005-01-30 23:51:02 +000096 << *I->getCallSite().getInstruction();
Chris Lattner78925492003-09-20 01:20:46 +000097 }
Misha Brukman2b37d7c2005-04-21 21:13:18 +000098
Vikram S. Adve586aa3c2002-11-13 15:41:00 +000099 TotalNumCallees += totalNumCallees;
100 NumIndirectCalls += numIndirectCalls;
Misha Brukman2b37d7c2005-04-21 21:13:18 +0000101
Chris Lattnered806bf2002-11-17 22:17:12 +0000102 if (numIndirectCalls)
103 std::cout << " In function " << F.getName() << ": "
104 << (totalNumCallees / (double) numIndirectCalls)
105 << " average callees per indirect call\n";
Vikram S. Adve586aa3c2002-11-13 15:41:00 +0000106}
107
Chris Lattner78925492003-09-20 01:20:46 +0000108DSNode *DSGraphStats::getNodeForValue(Value *V) {
109 const DSGraph *G = TDGraph;
Reid Spencere8404342004-07-18 00:18:30 +0000110 if (isa<Constant>(V))
Chris Lattner78925492003-09-20 01:20:46 +0000111 G = TDGraph->getGlobalsGraph();
Vikram S. Adve586aa3c2002-11-13 15:41:00 +0000112
Chris Lattner192cd9c2003-09-20 16:12:57 +0000113 const DSGraph::ScalarMapTy &ScalarMap = G->getScalarMap();
114 DSGraph::ScalarMapTy::const_iterator I = ScalarMap.find(V);
115 if (I != ScalarMap.end())
116 return I->second.getNode();
117 return 0;
118}
119
120bool DSGraphStats::isNodeForValueCollapsed(Value *V) {
121 if (DSNode *N = getNodeForValue(V))
Chris Lattner9970bf62003-09-20 21:48:01 +0000122 return N->isNodeCompletelyFolded() || N->isIncomplete();
Chris Lattner192cd9c2003-09-20 16:12:57 +0000123 return false;
Vikram S. Adve586aa3c2002-11-13 15:41:00 +0000124}
125
Chris Lattner78925492003-09-20 01:20:46 +0000126void DSGraphStats::visitLoad(LoadInst &LI) {
Chris Lattner192cd9c2003-09-20 16:12:57 +0000127 if (isNodeForValueCollapsed(LI.getOperand(0))) {
Chris Lattner78925492003-09-20 01:20:46 +0000128 NumUntypedMemAccesses++;
129 } else {
130 NumTypedMemAccesses++;
131 }
132}
133
134void DSGraphStats::visitStore(StoreInst &SI) {
Chris Lattner192cd9c2003-09-20 16:12:57 +0000135 if (isNodeForValueCollapsed(SI.getOperand(1))) {
Chris Lattner78925492003-09-20 01:20:46 +0000136 NumUntypedMemAccesses++;
137 } else {
138 NumTypedMemAccesses++;
139 }
140}
141
142
143
144bool DSGraphStats::runOnFunction(Function& F) {
145 TDGraph = &getAnalysis<TDDataStructures>().getDSGraph(F);
146 countCallees(F);
147 visit(F);
148 return true;
Vikram S. Adve586aa3c2002-11-13 15:41:00 +0000149}