//===-- InstCount.cpp - Collects the count of all instructions ------------===//
//
-// This pass collects the count of all instructions and reports them
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This pass collects the count of all instructions and reports them
//
//===----------------------------------------------------------------------===//
+#define DEBUG_TYPE "instcount"
+#include "llvm/Analysis/Passes.h"
+#include "llvm/ADT/Statistic.h"
+#include "llvm/IR/Function.h"
+#include "llvm/IR/InstVisitor.h"
#include "llvm/Pass.h"
-#include "llvm/Module.h"
-#include "llvm/Support/InstVisitor.h"
-#include "Support/Statistic.h"
+#include "llvm/Support/Debug.h"
+#include "llvm/Support/ErrorHandling.h"
+#include "llvm/Support/raw_ostream.h"
+using namespace llvm;
+
+STATISTIC(TotalInsts , "Number of instructions (of all types)");
+STATISTIC(TotalBlocks, "Number of basic blocks");
+STATISTIC(TotalFuncs , "Number of non-external functions");
+STATISTIC(TotalMemInst, "Number of memory instructions");
-namespace {
#define HANDLE_INST(N, OPCODE, CLASS) \
- Statistic<> Num##OPCODE##Inst("instcount", "Number of " #OPCODE " insts");
+ STATISTIC(Num ## OPCODE ## Inst, "Number of " #OPCODE " insts");
+
+#include "llvm/IR/Instruction.def"
-#include "llvm/Instruction.def"
- class InstCount : public Pass, public InstVisitor<InstCount> {
+namespace {
+ class InstCount : public FunctionPass, public InstVisitor<InstCount> {
friend class InstVisitor<InstCount>;
+ void visitFunction (Function &F) { ++TotalFuncs; }
+ void visitBasicBlock(BasicBlock &BB) { ++TotalBlocks; }
+
#define HANDLE_INST(N, OPCODE, CLASS) \
- void visit##OPCODE(CLASS &) { Num##OPCODE##Inst++; }
+ void visit##OPCODE(CLASS &) { ++Num##OPCODE##Inst; ++TotalInsts; }
-#include "llvm/Instruction.def"
+#include "llvm/IR/Instruction.def"
void visitInstruction(Instruction &I) {
- std::cerr << "Instruction Count does not know about " << I;
- abort();
+ errs() << "Instruction Count does not know about " << I;
+ llvm_unreachable(nullptr);
}
public:
- virtual bool run(Module &M);
+ static char ID; // Pass identification, replacement for typeid
+ InstCount() : FunctionPass(ID) {
+ initializeInstCountPass(*PassRegistry::getPassRegistry());
+ }
+
+ bool runOnFunction(Function &F) override;
- virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+ void getAnalysisUsage(AnalysisUsage &AU) const override {
AU.setPreservesAll();
}
- virtual void print(std::ostream &O, Module *M) const {}
+ void print(raw_ostream &O, const Module *M) const override {}
};
-
- RegisterAnalysis<InstCount> X("instcount",
- "Counts the various types of Instructions");
}
+char InstCount::ID = 0;
+INITIALIZE_PASS(InstCount, "instcount",
+ "Counts the various types of Instructions", false, true)
+
+FunctionPass *llvm::createInstCountPass() { return new InstCount(); }
+
// InstCount::run - This is the main Analysis entry point for a
// function.
//
-bool InstCount::run(Module &M) {
- visit(M);
+bool InstCount::runOnFunction(Function &F) {
+ unsigned StartMemInsts =
+ NumGetElementPtrInst + NumLoadInst + NumStoreInst + NumCallInst +
+ NumInvokeInst + NumAllocaInst;
+ visit(F);
+ unsigned EndMemInsts =
+ NumGetElementPtrInst + NumLoadInst + NumStoreInst + NumCallInst +
+ NumInvokeInst + NumAllocaInst;
+ TotalMemInst += EndMemInsts-StartMemInsts;
return false;
}