InstCount.cpp revision dce4a407a24b04eebc6a376f8e62b41aaa7b071f
18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//===-- InstCount.cpp - Collects the count of all instructions ------------===//
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//
38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//                     The LLVM Compiler Infrastructure
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//
58d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// This file is distributed under the University of Illinois Open Source
68d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// License. See LICENSE.TXT for details.
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//===----------------------------------------------------------------------===//
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// This pass collects the count of all instructions and reports them
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//===----------------------------------------------------------------------===//
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/Analysis/Passes.h"
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/ADT/Statistic.h"
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/IR/Function.h"
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/IR/InstVisitor.h"
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/Pass.h"
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/Support/Debug.h"
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/Support/ErrorHandling.h"
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/Support/raw_ostream.h"
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtusing namespace llvm;
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define DEBUG_TYPE "instcount"
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtSTATISTIC(TotalInsts , "Number of instructions (of all types)");
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtSTATISTIC(TotalBlocks, "Number of basic blocks");
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtSTATISTIC(TotalFuncs , "Number of non-external functions");
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtSTATISTIC(TotalMemInst, "Number of memory instructions");
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define HANDLE_INST(N, OPCODE, CLASS) \
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  STATISTIC(Num ## OPCODE ## Inst, "Number of " #OPCODE " insts");
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/IR/Instruction.def"
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnamespace {
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  class InstCount : public FunctionPass, public InstVisitor<InstCount> {
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    friend class InstVisitor<InstCount>;
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void visitFunction  (Function &F) { ++TotalFuncs; }
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void visitBasicBlock(BasicBlock &BB) { ++TotalBlocks; }
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define HANDLE_INST(N, OPCODE, CLASS) \
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void visit##OPCODE(CLASS &) { ++Num##OPCODE##Inst; ++TotalInsts; }
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/IR/Instruction.def"
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void visitInstruction(Instruction &I) {
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      errs() << "Instruction Count does not know about " << I;
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      llvm_unreachable(nullptr);
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    }
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  public:
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    static char ID; // Pass identification, replacement for typeid
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    InstCount() : FunctionPass(ID) {
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      initializeInstCountPass(*PassRegistry::getPassRegistry());
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    }
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    bool runOnFunction(Function &F) override;
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void getAnalysisUsage(AnalysisUsage &AU) const override {
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      AU.setPreservesAll();
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    }
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void print(raw_ostream &O, const Module *M) const override {}
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  };
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtchar InstCount::ID = 0;
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtINITIALIZE_PASS(InstCount, "instcount",
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                "Counts the various types of Instructions", false, true)
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
738d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtFunctionPass *llvm::createInstCountPass() { return new InstCount(); }
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// InstCount::run - This is the main Analysis entry point for a
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// function.
778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtbool InstCount::runOnFunction(Function &F) {
798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  unsigned StartMemInsts =
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    NumGetElementPtrInst + NumLoadInst + NumStoreInst + NumCallInst +
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    NumInvokeInst + NumAllocaInst;
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  visit(F);
838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  unsigned EndMemInsts =
848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    NumGetElementPtrInst + NumLoadInst + NumStoreInst + NumCallInst +
858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    NumInvokeInst + NumAllocaInst;
868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  TotalMemInst += EndMemInsts-StartMemInsts;
878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  return false;
888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt