mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-03 17:32:59 +00:00
e9e008859f
Summary: Previously, we counted TotalMemInst by reading certain instruction counters before and after calling visit and then finding the difference. But that wouldn't be thread safe if this same pass was being ran on multiple threads. This list of "memory instructions" doesn't make sense to me as it includes call/invoke and is missing atomics. This patch removes the counter all together. Reviewers: hfinkel, chandlerc, davide Reviewed By: davide Subscribers: davide, llvm-commits Differential Revision: https://reviews.llvm.org/D33608 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@308260 91177308-0d34-0410-b5e6-96231b3b80d8
80 lines
2.4 KiB
C++
80 lines
2.4 KiB
C++
//===-- 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;
|
|
}
|