1
//===-- InstCount.cpp - Collects the count of all instructions ------------===//
3
// The LLVM Compiler Infrastructure
5
// This file is distributed under the University of Illinois Open Source
6
// License. See LICENSE.TXT for details.
8
//===----------------------------------------------------------------------===//
10
// This pass collects the count of all instructions and reports them
12
//===----------------------------------------------------------------------===//
14
#define DEBUG_TYPE "instcount"
15
#include "llvm/Analysis/Passes.h"
16
#include "llvm/Pass.h"
17
#include "llvm/Function.h"
18
#include "llvm/Support/Debug.h"
19
#include "llvm/Support/ErrorHandling.h"
20
#include "llvm/Support/InstVisitor.h"
21
#include "llvm/Support/raw_ostream.h"
22
#include "llvm/ADT/Statistic.h"
25
STATISTIC(TotalInsts , "Number of instructions (of all types)");
26
STATISTIC(TotalBlocks, "Number of basic blocks");
27
STATISTIC(TotalFuncs , "Number of non-external functions");
28
STATISTIC(TotalMemInst, "Number of memory instructions");
30
#define HANDLE_INST(N, OPCODE, CLASS) \
31
STATISTIC(Num ## OPCODE ## Inst, "Number of " #OPCODE " insts");
33
#include "llvm/Instruction.def"
37
class InstCount : public FunctionPass, public InstVisitor<InstCount> {
38
friend class InstVisitor<InstCount>;
40
void visitFunction (Function &F) { ++TotalFuncs; }
41
void visitBasicBlock(BasicBlock &BB) { ++TotalBlocks; }
43
#define HANDLE_INST(N, OPCODE, CLASS) \
44
void visit##OPCODE(CLASS &) { ++Num##OPCODE##Inst; ++TotalInsts; }
46
#include "llvm/Instruction.def"
48
void visitInstruction(Instruction &I) {
49
errs() << "Instruction Count does not know about " << I;
53
static char ID; // Pass identification, replacement for typeid
54
InstCount() : FunctionPass(&ID) {}
56
virtual bool runOnFunction(Function &F);
58
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
61
virtual void print(raw_ostream &O, const Module *M) const {}
66
char InstCount::ID = 0;
67
static RegisterPass<InstCount>
68
X("instcount", "Counts the various types of Instructions", false, true);
70
FunctionPass *llvm::createInstCountPass() { return new InstCount(); }
72
// InstCount::run - This is the main Analysis entry point for a
75
bool InstCount::runOnFunction(Function &F) {
76
unsigned StartMemInsts =
77
NumGetElementPtrInst + NumLoadInst + NumStoreInst + NumCallInst +
78
NumInvokeInst + NumAllocaInst;
80
unsigned EndMemInsts =
81
NumGetElementPtrInst + NumLoadInst + NumStoreInst + NumCallInst +
82
NumInvokeInst + NumAllocaInst;
83
TotalMemInst += EndMemInsts-StartMemInsts;