1*9880d681SAndroid Build Coastguard Worker //===-- InstCount.cpp - Collects the count of all instructions ------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This pass collects the count of all instructions and reports them
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/Passes.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/Statistic.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Function.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/InstVisitor.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/Pass.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Debug.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ErrorHandling.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h"
22*9880d681SAndroid Build Coastguard Worker using namespace llvm;
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Worker #define DEBUG_TYPE "instcount"
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker STATISTIC(TotalInsts , "Number of instructions (of all types)");
27*9880d681SAndroid Build Coastguard Worker STATISTIC(TotalBlocks, "Number of basic blocks");
28*9880d681SAndroid Build Coastguard Worker STATISTIC(TotalFuncs , "Number of non-external functions");
29*9880d681SAndroid Build Coastguard Worker STATISTIC(TotalMemInst, "Number of memory instructions");
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker #define HANDLE_INST(N, OPCODE, CLASS) \
32*9880d681SAndroid Build Coastguard Worker STATISTIC(Num ## OPCODE ## Inst, "Number of " #OPCODE " insts");
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Instruction.def"
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker namespace {
38*9880d681SAndroid Build Coastguard Worker class InstCount : public FunctionPass, public InstVisitor<InstCount> {
39*9880d681SAndroid Build Coastguard Worker friend class InstVisitor<InstCount>;
40*9880d681SAndroid Build Coastguard Worker
visitFunction(Function & F)41*9880d681SAndroid Build Coastguard Worker void visitFunction (Function &F) { ++TotalFuncs; }
visitBasicBlock(BasicBlock & BB)42*9880d681SAndroid Build Coastguard Worker void visitBasicBlock(BasicBlock &BB) { ++TotalBlocks; }
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Worker #define HANDLE_INST(N, OPCODE, CLASS) \
45*9880d681SAndroid Build Coastguard Worker void visit##OPCODE(CLASS &) { ++Num##OPCODE##Inst; ++TotalInsts; }
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Instruction.def"
48*9880d681SAndroid Build Coastguard Worker
visitInstruction(Instruction & I)49*9880d681SAndroid Build Coastguard Worker void visitInstruction(Instruction &I) {
50*9880d681SAndroid Build Coastguard Worker errs() << "Instruction Count does not know about " << I;
51*9880d681SAndroid Build Coastguard Worker llvm_unreachable(nullptr);
52*9880d681SAndroid Build Coastguard Worker }
53*9880d681SAndroid Build Coastguard Worker public:
54*9880d681SAndroid Build Coastguard Worker static char ID; // Pass identification, replacement for typeid
InstCount()55*9880d681SAndroid Build Coastguard Worker InstCount() : FunctionPass(ID) {
56*9880d681SAndroid Build Coastguard Worker initializeInstCountPass(*PassRegistry::getPassRegistry());
57*9880d681SAndroid Build Coastguard Worker }
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker bool runOnFunction(Function &F) override;
60*9880d681SAndroid Build Coastguard Worker
getAnalysisUsage(AnalysisUsage & AU) const61*9880d681SAndroid Build Coastguard Worker void getAnalysisUsage(AnalysisUsage &AU) const override {
62*9880d681SAndroid Build Coastguard Worker AU.setPreservesAll();
63*9880d681SAndroid Build Coastguard Worker }
print(raw_ostream & O,const Module * M) const64*9880d681SAndroid Build Coastguard Worker void print(raw_ostream &O, const Module *M) const override {}
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker };
67*9880d681SAndroid Build Coastguard Worker }
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Worker char InstCount::ID = 0;
70*9880d681SAndroid Build Coastguard Worker INITIALIZE_PASS(InstCount, "instcount",
71*9880d681SAndroid Build Coastguard Worker "Counts the various types of Instructions", false, true)
72*9880d681SAndroid Build Coastguard Worker
createInstCountPass()73*9880d681SAndroid Build Coastguard Worker FunctionPass *llvm::createInstCountPass() { return new InstCount(); }
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker // InstCount::run - This is the main Analysis entry point for a
76*9880d681SAndroid Build Coastguard Worker // function.
77*9880d681SAndroid Build Coastguard Worker //
runOnFunction(Function & F)78*9880d681SAndroid Build Coastguard Worker bool InstCount::runOnFunction(Function &F) {
79*9880d681SAndroid Build Coastguard Worker unsigned StartMemInsts =
80*9880d681SAndroid Build Coastguard Worker NumGetElementPtrInst + NumLoadInst + NumStoreInst + NumCallInst +
81*9880d681SAndroid Build Coastguard Worker NumInvokeInst + NumAllocaInst;
82*9880d681SAndroid Build Coastguard Worker visit(F);
83*9880d681SAndroid Build Coastguard Worker unsigned EndMemInsts =
84*9880d681SAndroid Build Coastguard Worker NumGetElementPtrInst + NumLoadInst + NumStoreInst + NumCallInst +
85*9880d681SAndroid Build Coastguard Worker NumInvokeInst + NumAllocaInst;
86*9880d681SAndroid Build Coastguard Worker TotalMemInst += EndMemInsts-StartMemInsts;
87*9880d681SAndroid Build Coastguard Worker return false;
88*9880d681SAndroid Build Coastguard Worker }
89