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