Changes For Bug 352
[oota-llvm.git] / lib / Analysis / InstCount.cpp
index d94056443f29715a5b2cc12169ac3a24a0e3aadd..12d16b081e7b3db6b4b383e92f1e14405c3b054e 100644 (file)
 //===-- InstCount.cpp - Collects the count of all instructions ------------===//
+// 
+//                     The LLVM Compiler Infrastructure
 //
-// This pass collects the count of all instructions and reports them 
+// This file was developed by the LLVM research group and 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/Pass.h"
-#include "llvm/Module.h"
-#include "llvm/iMemory.h"
-#include "llvm/iTerminators.h"
-#include "llvm/iPHINode.h"
-#include "llvm/iOther.h"
-#include "llvm/iOperators.h"
+#include "llvm/Function.h"
 #include "llvm/Support/InstVisitor.h"
-#include "llvm/Support/InstIterator.h"
-#include "llvm/Support/InstIterator.h"
-#include "Support/Statistic.h"
-#include <algorithm>
+#include "llvm/ADT/Statistic.h"
+
+namespace llvm {
 
 namespace {
-  static Statistic<> NumReturnInst("instcount","Number of ReturnInsts");
-  static Statistic<> NumBranchInst("instcount", "Number of BranchInsts");
-  static Statistic<> NumPHINode("instcount", "Number of PHINodes");
-  static Statistic<> NumCastInst("instcount", "Number of CastInsts");
-  static Statistic<> NumCallInst("instcount", "Number of CallInsts");
-  static Statistic<> NumMallocInst("instcount", "Number of MallocInsts");
-  static Statistic<> NumAllocaInst("instcount", "Number of AllocaInsts");
-  static Statistic<> NumFreeInst("instcount", "Number of FreeInsts");
-  static Statistic<> NumLoadInst("instcount", "Number of LoadInsts");
-  static Statistic<> NumStoreInst("instcount", "Number of StoreInsts");
-  static Statistic<> NumGetElementPtrInst("instcount",
-                                         "Number of GetElementPtrInsts");
-                                                     
-  static Statistic<> NumSwitchInst("instcount", "Number of SwitchInsts");
-  static Statistic<> NumInvokeInst("instcount", "Number of InvokeInsts");
-  static Statistic<> NumBinaryOperator("instcount",
-                                      "Total Number of BinaryOperators");
-                                                          
-  static Statistic<> NumShiftInst("instcount", " Total Number of ShiftInsts");
-  static Statistic<> NumShlInst("instcount", "Number of Left ShiftInsts");
-                                                           
-  static Statistic<> NumShrInst("instcount", "Number of Right ShiftInsts");
-                                                                
+  Statistic<> TotalInsts ("instcount", "Number of instructions (of all types)");
+  Statistic<> TotalBlocks("instcount", "Number of basic blocks");
+  Statistic<> TotalFuncs ("instcount", "Number of non-external functions");
+
+#define HANDLE_INST(N, OPCODE, CLASS) \
+    Statistic<> Num##OPCODE##Inst("instcount", "Number of " #OPCODE " insts");
 
-  static Statistic<> NumAddInst("instcount", "Number of AddInsts");
-  static Statistic<> NumSubInst("instcount", "Number of SubInsts");
-  static Statistic<> NumMulInst("instcount", "Number of MulInsts");
-  static Statistic<> NumDivInst("instcount", "Number of DivInsts");
-  static Statistic<> NumRemInst("instcount", "Number of RemInsts");
-  static Statistic<> NumAndInst("instcount", "Number of AndInsts");
-  static Statistic<> NumOrInst("instcount", "Number of OrInsts");
-  static Statistic<> NumXorInst("instcount", "Number of XorInsts");
-  static Statistic<> NumSetCondInst("instcount", "Total Number of SetCondInsts");
-  static Statistic<> NumSetEQInst("instcount", "Number of SetEQInsts");
-  static Statistic<> NumSetNEInst("instcount", "Number of SetNEInsts");
-  static Statistic<> NumSetLEInst("instcount", "Number of SetLEInsts");
-  static Statistic<> NumSetGEInst("instcount", "Number of SetGEInsts");
-  static Statistic<> NumSetLTInst("instcount", "Number of SetLTInsts");
-  static Statistic<> NumSetGTInst("instcount", "Number of SetGTInsts");
-  
-  class InstCount : public Pass, public InstVisitor<InstCount> {
-  private:
-        friend class InstVisitor<InstCount>;
+#include "llvm/Instruction.def"
 
+  class InstCount : public FunctionPass, public InstVisitor<InstCount> {
+    friend class InstVisitor<InstCount>;
 
-    void visitBinaryOperator(BinaryOperator &I);
-    void visitShiftInst(ShiftInst &I);
-    void visitSetCondInst(SetCondInst &I);
-    
-    inline void visitSwitchInst(SwitchInst &I) { NumSwitchInst++; }
-    inline void visitInvokeInst(InvokeInst &I) { NumInvokeInst++; }
-    inline void visitReturnInst(ReturnInst &I) { NumReturnInst++; }
-    inline void visitBranchInst(BranchInst &I) { NumBranchInst++; }
-    inline void visitPHINode(PHINode &I) { NumPHINode++; }
-    inline void visitCastInst (CastInst &I) { NumCastInst++; }
-    inline void visitCallInst (CallInst &I) { NumCallInst++; }
-    inline void visitMallocInst(MallocInst &I) { NumMallocInst++; }
-    inline void visitAllocaInst(AllocaInst &I) { NumAllocaInst++; }
-    inline void visitFreeInst  (FreeInst   &I) { NumFreeInst++; }
-    inline void visitLoadInst  (LoadInst   &I) { NumLoadInst++; }
-    inline void visitStoreInst (StoreInst  &I) { NumStoreInst++; }
-    inline void visitGetElementPtrInst(GetElementPtrInst &I) {
-      NumGetElementPtrInst++; }
+    void visitFunction  (Function &F) { ++TotalFuncs; }
+    void visitBasicBlock(BasicBlock &BB) { ++TotalBlocks; }
 
-    inline void visitInstruction(Instruction &I) {
+#define HANDLE_INST(N, OPCODE, CLASS) \
+    void visit##OPCODE(CLASS &) { ++Num##OPCODE##Inst; ++TotalInsts; }
+
+#include "llvm/Instruction.def"
+
+    void visitInstruction(Instruction &I) {
       std::cerr << "Instruction Count does not know about " << I;
       abort();
     }
   public:
-    virtual bool run(Module &M);
+    virtual bool runOnFunction(Function &F);
 
     virtual void getAnalysisUsage(AnalysisUsage &AU) const {
       AU.setPreservesAll();
     }
+    virtual void print(std::ostream &O, const Module *M) const {}
+
   };
 
   RegisterAnalysis<InstCount> X("instcount",
-                          "Counts the various types of Instructions");
-                                                            
+                                "Counts the various types of Instructions");
 }
 
-// createInstCountPass - The public interface to this file...
-Pass *createInstCountPass() { return new InstCount(); }
-
-
 // InstCount::run - This is the main Analysis entry point for a
 // function.
 //
-bool InstCount::run(Module &M) {
-  for (Module::iterator mI = M.begin(), mE = M.end(); mI != mE; ++mI)
-    for (inst_iterator I = inst_begin(*mI), E = inst_end(*mI); I != E; ++I)
-      visit(*I);
+bool InstCount::runOnFunction(Function &F) {
+  visit(F);
   return false;
 }
 
-
-
-void InstCount::visitBinaryOperator(BinaryOperator &I) {
-  NumBinaryOperator++;
-  switch (I.getOpcode()) {
-  case Instruction::Add: NumAddInst++; break;
-  case Instruction::Sub: NumSubInst++; break;
-  case Instruction::Mul: NumMulInst++; break;
-  case Instruction::Div: NumDivInst++; break;
-  case Instruction::Rem: NumRemInst++; break;
-  case Instruction::And: NumAndInst++; break;
-  case Instruction::Or: NumOrInst++; break;
-  case Instruction::Xor: NumXorInst++; break;
-  default : std::cerr<< " Wrong binary operator \n";
-  }
-}
-
-void InstCount::visitSetCondInst(SetCondInst &I) {
-  NumBinaryOperator++;
-  NumSetCondInst++;
-  switch (I.getOpcode()) {
-  case Instruction::SetEQ: NumSetEQInst++; break;
-  case Instruction::SetNE: NumSetNEInst++; break;
-  case Instruction::SetLE: NumSetLEInst++; break;
-  case Instruction::SetGE: NumSetGEInst++; break;
-  case Instruction::SetLT: NumSetLTInst++; break;
-  case Instruction::SetGT: NumSetGTInst++; break;
-  default : std::cerr<< " Wrong SetCond Inst \n";
-  }
-}
-
-void InstCount::visitShiftInst(ShiftInst &I) { 
-  NumShiftInst++;
-  switch (I.getOpcode()) {
-  case Instruction::Shl: NumShlInst++; break;
-  case Instruction::Shr: NumShrInst++; break;
-  default : std::cerr<< " Wrong ShiftInst \n";
-  }
-}
+} // End llvm namespace