10b57cec5SDimitry Andric //===-- InstCount.cpp - Collects the count of all instructions ------------===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric // 90b57cec5SDimitry Andric // This pass collects the count of all instructions and reports them 100b57cec5SDimitry Andric // 110b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric 13*e8d8bef9SDimitry Andric #include "llvm/Analysis/InstCount.h" 140b57cec5SDimitry Andric #include "llvm/ADT/Statistic.h" 150b57cec5SDimitry Andric #include "llvm/Analysis/Passes.h" 160b57cec5SDimitry Andric #include "llvm/IR/Function.h" 170b57cec5SDimitry Andric #include "llvm/IR/InstVisitor.h" 180b57cec5SDimitry Andric #include "llvm/Support/Debug.h" 190b57cec5SDimitry Andric #include "llvm/Support/ErrorHandling.h" 200b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h" 210b57cec5SDimitry Andric using namespace llvm; 220b57cec5SDimitry Andric 230b57cec5SDimitry Andric #define DEBUG_TYPE "instcount" 240b57cec5SDimitry Andric 250b57cec5SDimitry Andric STATISTIC(TotalInsts, "Number of instructions (of all types)"); 260b57cec5SDimitry Andric STATISTIC(TotalBlocks, "Number of basic blocks"); 270b57cec5SDimitry Andric STATISTIC(TotalFuncs, "Number of non-external functions"); 280b57cec5SDimitry Andric 290b57cec5SDimitry Andric #define HANDLE_INST(N, OPCODE, CLASS) \ 300b57cec5SDimitry Andric STATISTIC(Num##OPCODE##Inst, "Number of " #OPCODE " insts"); 310b57cec5SDimitry Andric 320b57cec5SDimitry Andric #include "llvm/IR/Instruction.def" 330b57cec5SDimitry Andric 340b57cec5SDimitry Andric namespace { 35*e8d8bef9SDimitry Andric class InstCount : public InstVisitor<InstCount> { 360b57cec5SDimitry Andric friend class InstVisitor<InstCount>; 370b57cec5SDimitry Andric 380b57cec5SDimitry Andric void visitFunction(Function &F) { ++TotalFuncs; } 390b57cec5SDimitry Andric void visitBasicBlock(BasicBlock &BB) { ++TotalBlocks; } 400b57cec5SDimitry Andric 410b57cec5SDimitry Andric #define HANDLE_INST(N, OPCODE, CLASS) \ 42*e8d8bef9SDimitry Andric void visit##OPCODE(CLASS &) { \ 43*e8d8bef9SDimitry Andric ++Num##OPCODE##Inst; \ 44*e8d8bef9SDimitry Andric ++TotalInsts; \ 45*e8d8bef9SDimitry Andric } 460b57cec5SDimitry Andric 470b57cec5SDimitry Andric #include "llvm/IR/Instruction.def" 480b57cec5SDimitry Andric 490b57cec5SDimitry Andric void visitInstruction(Instruction &I) { 500b57cec5SDimitry Andric errs() << "Instruction Count does not know about " << I; 510b57cec5SDimitry Andric llvm_unreachable(nullptr); 520b57cec5SDimitry Andric } 53*e8d8bef9SDimitry Andric }; 54*e8d8bef9SDimitry Andric } // namespace 55*e8d8bef9SDimitry Andric 56*e8d8bef9SDimitry Andric PreservedAnalyses InstCountPass::run(Function &F, 57*e8d8bef9SDimitry Andric FunctionAnalysisManager &FAM) { 58*e8d8bef9SDimitry Andric LLVM_DEBUG(dbgs() << "INSTCOUNT: running on function " << F.getName() 59*e8d8bef9SDimitry Andric << "\n"); 60*e8d8bef9SDimitry Andric InstCount().visit(F); 61*e8d8bef9SDimitry Andric 62*e8d8bef9SDimitry Andric return PreservedAnalyses::all(); 630b57cec5SDimitry Andric } 64