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