xref: /aosp_15_r20/external/llvm/lib/Analysis/InstCount.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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