1e555460e4e47458e99801c7ab0f85cfdf80583a0Dinakar Dhurjati//===-- InstCount.cpp - Collects the count of all instructions ------------===// 22b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman// 3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// The LLVM Compiler Infrastructure 4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 72b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman// 8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===// 9e555460e4e47458e99801c7ab0f85cfdf80583a0Dinakar Dhurjati// 102b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman// This pass collects the count of all instructions and reports them 11e555460e4e47458e99801c7ab0f85cfdf80583a0Dinakar Dhurjati// 12e555460e4e47458e99801c7ab0f85cfdf80583a0Dinakar Dhurjati//===----------------------------------------------------------------------===// 13e555460e4e47458e99801c7ab0f85cfdf80583a0Dinakar Dhurjati 144fb1b21b312fd91b93c50b1c625edbc1fd34cf56Chris Lattner#include "llvm/Analysis/Passes.h" 15d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/Statistic.h" 160b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Function.h" 1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/InstVisitor.h" 18e555460e4e47458e99801c7ab0f85cfdf80583a0Dinakar Dhurjati#include "llvm/Pass.h" 19270862dad4d12da5fd7f030210a9d66c8247d0cbDavid Greene#include "llvm/Support/Debug.h" 207d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin#include "llvm/Support/ErrorHandling.h" 21bdff548e4dd577a72094d57b282de4e765643b96Chris Lattner#include "llvm/Support/raw_ostream.h" 226ae7e9837cd4261029d5a9d65ab8d3295b8884edChris Lattnerusing namespace llvm; 23d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 24dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "instcount" 25dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 263b27d68c6af2582df0962557f1fe5c3f70f46e3fChris LattnerSTATISTIC(TotalInsts , "Number of instructions (of all types)"); 273b27d68c6af2582df0962557f1fe5c3f70f46e3fChris LattnerSTATISTIC(TotalBlocks, "Number of basic blocks"); 283b27d68c6af2582df0962557f1fe5c3f70f46e3fChris LattnerSTATISTIC(TotalFuncs , "Number of non-external functions"); 293b27d68c6af2582df0962557f1fe5c3f70f46e3fChris LattnerSTATISTIC(TotalMemInst, "Number of memory instructions"); 30a1af8bd72b783108ad950e22ba98a402a773111aChris Lattner 31149a5203a91e3794cc74c04ffbe811d744eecabdChris Lattner#define HANDLE_INST(N, OPCODE, CLASS) \ 323b27d68c6af2582df0962557f1fe5c3f70f46e3fChris Lattner STATISTIC(Num ## OPCODE ## Inst, "Number of " #OPCODE " insts"); 33149a5203a91e3794cc74c04ffbe811d744eecabdChris Lattner 340b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Instruction.def" 35e555460e4e47458e99801c7ab0f85cfdf80583a0Dinakar Dhurjati 363b27d68c6af2582df0962557f1fe5c3f70f46e3fChris Lattner 373b27d68c6af2582df0962557f1fe5c3f70f46e3fChris Lattnernamespace { 386726b6d75a8b679068a58cb954ba97cf9d1690baNick Lewycky class InstCount : public FunctionPass, public InstVisitor<InstCount> { 39e26057a376f04e20da6c7217d19eaa184767cb1dReid Spencer friend class InstVisitor<InstCount>; 40e555460e4e47458e99801c7ab0f85cfdf80583a0Dinakar Dhurjati 41a1af8bd72b783108ad950e22ba98a402a773111aChris Lattner void visitFunction (Function &F) { ++TotalFuncs; } 42a1af8bd72b783108ad950e22ba98a402a773111aChris Lattner void visitBasicBlock(BasicBlock &BB) { ++TotalBlocks; } 43a1af8bd72b783108ad950e22ba98a402a773111aChris Lattner 44149a5203a91e3794cc74c04ffbe811d744eecabdChris Lattner#define HANDLE_INST(N, OPCODE, CLASS) \ 45a1af8bd72b783108ad950e22ba98a402a773111aChris Lattner void visit##OPCODE(CLASS &) { ++Num##OPCODE##Inst; ++TotalInsts; } 46e555460e4e47458e99801c7ab0f85cfdf80583a0Dinakar Dhurjati 470b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Instruction.def" 48e555460e4e47458e99801c7ab0f85cfdf80583a0Dinakar Dhurjati 498c8b9ee8c8646aa1a79c782d4da9abdf3eb4eefeArgyrios Kyrtzidis void visitInstruction(Instruction &I) { 50b64ca1385a459da0e10e43c81bf26bb177b24e29David Greene errs() << "Instruction Count does not know about " << I; 51dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines llvm_unreachable(nullptr); 52e555460e4e47458e99801c7ab0f85cfdf80583a0Dinakar Dhurjati } 53e555460e4e47458e99801c7ab0f85cfdf80583a0Dinakar Dhurjati public: 54ecd94c804a563f2a86572dcf1d2e81f397e19daaNick Lewycky static char ID; // Pass identification, replacement for typeid 55081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson InstCount() : FunctionPass(ID) { 56081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson initializeInstCountPass(*PassRegistry::getPassRegistry()); 57081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson } 58794fd75c67a2cdc128d67342c6d88a504d186896Devang Patel 5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool runOnFunction(Function &F) override; 60e555460e4e47458e99801c7ab0f85cfdf80583a0Dinakar Dhurjati 6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void getAnalysisUsage(AnalysisUsage &AU) const override { 62e555460e4e47458e99801c7ab0f85cfdf80583a0Dinakar Dhurjati AU.setPreservesAll(); 63e555460e4e47458e99801c7ab0f85cfdf80583a0Dinakar Dhurjati } 6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void print(raw_ostream &O, const Module *M) const override {} 65149a5203a91e3794cc74c04ffbe811d744eecabdChris Lattner 66e555460e4e47458e99801c7ab0f85cfdf80583a0Dinakar Dhurjati }; 67e555460e4e47458e99801c7ab0f85cfdf80583a0Dinakar Dhurjati} 68e555460e4e47458e99801c7ab0f85cfdf80583a0Dinakar Dhurjati 69844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanchar InstCount::ID = 0; 70d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen AndersonINITIALIZE_PASS(InstCount, "instcount", 71ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson "Counts the various types of Instructions", false, true) 72844731a7f1909f55935e3514c9e713a62d67662eDan Gohman 734fb1b21b312fd91b93c50b1c625edbc1fd34cf56Chris LattnerFunctionPass *llvm::createInstCountPass() { return new InstCount(); } 744fb1b21b312fd91b93c50b1c625edbc1fd34cf56Chris Lattner 75e555460e4e47458e99801c7ab0f85cfdf80583a0Dinakar Dhurjati// InstCount::run - This is the main Analysis entry point for a 76e555460e4e47458e99801c7ab0f85cfdf80583a0Dinakar Dhurjati// function. 77e555460e4e47458e99801c7ab0f85cfdf80583a0Dinakar Dhurjati// 786666a04c6c3797c3833e1af0d9b1c6d896b3c1f0Chris Lattnerbool InstCount::runOnFunction(Function &F) { 796ae7e9837cd4261029d5a9d65ab8d3295b8884edChris Lattner unsigned StartMemInsts = 802b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman NumGetElementPtrInst + NumLoadInst + NumStoreInst + NumCallInst + 81046e78ce55a7c3d82b7b6758d2d77f2d99f970bfVictor Hernandez NumInvokeInst + NumAllocaInst; 826666a04c6c3797c3833e1af0d9b1c6d896b3c1f0Chris Lattner visit(F); 836ae7e9837cd4261029d5a9d65ab8d3295b8884edChris Lattner unsigned EndMemInsts = 842b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman NumGetElementPtrInst + NumLoadInst + NumStoreInst + NumCallInst + 85046e78ce55a7c3d82b7b6758d2d77f2d99f970bfVictor Hernandez NumInvokeInst + NumAllocaInst; 866ae7e9837cd4261029d5a9d65ab8d3295b8884edChris Lattner TotalMemInst += EndMemInsts-StartMemInsts; 87e555460e4e47458e99801c7ab0f85cfdf80583a0Dinakar Dhurjati return false; 88e555460e4e47458e99801c7ab0f85cfdf80583a0Dinakar Dhurjati} 89