LLVM  14.0.0git
InstCount.cpp
Go to the documentation of this file.
1 //===-- InstCount.cpp - Collects the count of all instructions ------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This pass collects the count of all instructions and reports them
10 //
11 //===----------------------------------------------------------------------===//
12 
14 #include "llvm/ADT/Statistic.h"
15 #include "llvm/Analysis/Passes.h"
16 #include "llvm/IR/Function.h"
17 #include "llvm/IR/InstVisitor.h"
18 #include "llvm/InitializePasses.h"
19 #include "llvm/Pass.h"
20 #include "llvm/Support/Debug.h"
23 using namespace llvm;
24 
25 #define DEBUG_TYPE "instcount"
26 
27 STATISTIC(TotalInsts, "Number of instructions (of all types)");
28 STATISTIC(TotalBlocks, "Number of basic blocks");
29 STATISTIC(TotalFuncs, "Number of non-external functions");
30 
31 #define HANDLE_INST(N, OPCODE, CLASS) \
32  STATISTIC(Num##OPCODE##Inst, "Number of " #OPCODE " insts");
33 
34 #include "llvm/IR/Instruction.def"
35 
36 namespace {
37 class InstCount : public InstVisitor<InstCount> {
38  friend class InstVisitor<InstCount>;
39 
40  void visitFunction(Function &F) { ++TotalFuncs; }
41  void visitBasicBlock(BasicBlock &BB) { ++TotalBlocks; }
42 
43 #define HANDLE_INST(N, OPCODE, CLASS) \
44  void visit##OPCODE(CLASS &) { \
45  ++Num##OPCODE##Inst; \
46  ++TotalInsts; \
47  }
48 
49 #include "llvm/IR/Instruction.def"
50 
51  void visitInstruction(Instruction &I) {
52  errs() << "Instruction Count does not know about " << I;
53  llvm_unreachable(nullptr);
54  }
55 };
56 } // namespace
57 
60  LLVM_DEBUG(dbgs() << "INSTCOUNT: running on function " << F.getName()
61  << "\n");
62  InstCount().visit(F);
63 
64  return PreservedAnalyses::all();
65 }
66 
67 namespace {
68 class InstCountLegacyPass : public FunctionPass {
69 public:
70  static char ID; // Pass identification, replacement for typeid
71  InstCountLegacyPass() : FunctionPass(ID) {
73  }
74 
75  bool runOnFunction(Function &F) override {
76  LLVM_DEBUG(dbgs() << "INSTCOUNT: running on function " << F.getName()
77  << "\n");
78  InstCount().visit(F);
79  return false;
80  };
81 
82  void getAnalysisUsage(AnalysisUsage &AU) const override {
83  AU.setPreservesAll();
84  }
85 
86  void print(raw_ostream &O, const Module *M) const override {}
87 };
88 } // namespace
89 
91 INITIALIZE_PASS(InstCountLegacyPass, "instcount",
92  "Counts the various types of Instructions", false, true)
93 
94 FunctionPass *llvm::createInstCountPass() { return new InstCountLegacyPass(); }
llvm::PreservedAnalyses
A set of analyses that are preserved following a run of a transformation pass.
Definition: PassManager.h:155
llvm
---------------------— PointerInfo ------------------------------------—
Definition: AllocatorList.h:23
print
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
Definition: ArchiveWriter.cpp:147
llvm::Function
Definition: Function.h:61
Pass.h
Statistic.h
ErrorHandling.h
InstCount.h
FAM
FunctionAnalysisManager FAM
Definition: PassBuilderBindings.cpp:59
llvm::errs
raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
Definition: raw_ostream.cpp:892
LLVM_DEBUG
#define LLVM_DEBUG(X)
Definition: Debug.h:101
F
#define F(x, y, z)
Definition: MD5.cpp:56
llvm::BasicBlock
LLVM Basic Block Representation.
Definition: BasicBlock.h:58
llvm::dbgs
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:163
llvm::PassRegistry::getPassRegistry
static PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
Definition: PassRegistry.cpp:31
llvm::AnalysisUsage
Represent the analysis usage information of a pass.
Definition: PassAnalysisSupport.h:47
llvm::Instruction
Definition: Instruction.h:45
llvm::STATISTIC
STATISTIC(NumFunctions, "Total number of functions")
llvm::raw_ostream
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:53
llvm::InstCountPass::run
PreservedAnalyses run(Function &F, FunctionAnalysisManager &)
Definition: InstCount.cpp:58
INITIALIZE_PASS
INITIALIZE_PASS(InstCountLegacyPass, "instcount", "Counts the various types of Instructions", false, true) FunctionPass *llvm
Definition: InstCount.cpp:91
llvm::RISCVFenceField::O
@ O
Definition: RISCVBaseInfo.h:192
I
#define I(x, y, z)
Definition: MD5.cpp:59
llvm::Module
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:67
InstVisitor.h
llvm_unreachable
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Definition: ErrorHandling.h:136
llvm::InstVisitor
Base class for instruction visitors.
Definition: InstVisitor.h:79
llvm::initializeInstCountLegacyPassPass
void initializeInstCountLegacyPassPass(PassRegistry &)
runOnFunction
static bool runOnFunction(Function &F, bool PostInlining)
Definition: EntryExitInstrumenter.cpp:69
llvm::AnalysisUsage::setPreservesAll
void setPreservesAll()
Set by analyses that do not transform their input at all.
Definition: PassAnalysisSupport.h:130
llvm::PreservedAnalyses::all
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition: PassManager.h:161
llvm::createInstCountPass
FunctionPass * createInstCountPass()
Function.h
llvm::AnalysisManager
A container for analyses that lazily runs them and caches their results.
Definition: InstructionSimplify.h:44
llvm::FunctionPass
FunctionPass class - This class is used to implement most global optimizations.
Definition: Pass.h:298
BB
Common register allocation spilling lr str ldr sxth r3 ldr mla r4 can lr mov lr str ldr sxth r3 mla r4 and then merge mul and lr str ldr sxth r3 mla r4 It also increase the likelihood the store may become dead bb27 Successors according to LLVM BB
Definition: README.txt:39
raw_ostream.h
InitializePasses.h
Debug.h
Passes.h
llvm::Intrinsic::ID
unsigned ID
Definition: TargetTransformInfo.h:37