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