llvm.org GIT mirror llvm / testing lib / Analysis / InstCount.cpp
testing

Tree @testing (Download .tar.gz)

InstCount.cpp @testing

e555460
2b37d7c
b576c94
 
4ee451d
 
2b37d7c
b576c94
e555460
2b37d7c
e555460
 
 
d04a8d4
e3e43d9
0b8c9a8
67f6bf7
e555460
270862d
7d696d8
bdff548
6ae7e98
d0fde30
4da2537
 
3b27d68
 
 
a1af8bd
149a520
3b27d68
149a520
0b8c9a8
e555460
3b27d68
6726b6d
e26057a
e555460
a1af8bd
 
 
149a520
a1af8bd
e555460
0b8c9a8
e555460
8c8b9ee
b64ca13
570e52c
e555460
 
ecd94c8
081c34b
 
 
794fd75
c37e6c0
e555460
c37e6c0
e555460
 
c37e6c0
149a520
e555460
cd52a7a
e555460
844731a
d13db2c
ce665bd
844731a
4fb1b21
 
e555460
 
 
6666a04
 
e555460
 
//===-- InstCount.cpp - Collects the count of all instructions ------------===//
//
//                     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
//
//===----------------------------------------------------------------------===//

#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/Passes.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/InstVisitor.h"
#include "llvm/Pass.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
using namespace llvm;

#define DEBUG_TYPE "instcount"

STATISTIC(TotalInsts , "Number of instructions (of all types)");
STATISTIC(TotalBlocks, "Number of basic blocks");
STATISTIC(TotalFuncs , "Number of non-external functions");

#define HANDLE_INST(N, OPCODE, CLASS) \
  STATISTIC(Num ## OPCODE ## Inst, "Number of " #OPCODE " insts");

#include "llvm/IR/Instruction.def"

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; ++TotalInsts; }

#include "llvm/IR/Instruction.def"

    void visitInstruction(Instruction &I) {
      errs() << "Instruction Count does not know about " << I;
      llvm_unreachable(nullptr);
    }
  public:
    static char ID; // Pass identification, replacement for typeid
    InstCount() : FunctionPass(ID) {
      initializeInstCountPass(*PassRegistry::getPassRegistry());
    }

    bool runOnFunction(Function &F) override;

    void getAnalysisUsage(AnalysisUsage &AU) const override {
      AU.setPreservesAll();
    }
    void print(raw_ostream &O, const Module *M) const override {}

  };
}

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::runOnFunction(Function &F) {
  visit(F);
  return false;
}