AnalysisWrappers.cpp revision 7c0e022c5c4be4b11e199a53f73bbdd84e34aa80
1781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner//===- AnalysisWrappers.cpp - Wrappers around non-pass analyses -----------===//
27c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//
37c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//                     The LLVM Compiler Infrastructure
47c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//
57c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// This file was developed by the LLVM research group and is distributed under
67c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details.
77c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//
87c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//===----------------------------------------------------------------------===//
97c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//
10781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner//
11781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner// This file defines pass wrappers around LLVM analyses that don't make sense to
12781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner// be passes.  It provides a nice standard pass interface to these classes so
13781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner// that they can be printed out by analyze.
14781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner//
15bc0e998c497446f5448425b3cbd7f8f19a458764Misha Brukman// These classes are separated out of analyze.cpp so that it is more clear which
16781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner// code is the integral part of the analyze tool, and which part of the code is
17781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner// just making it so more passes are available.
18781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner//
19781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner//===----------------------------------------------------------------------===//
20781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner
21781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner#include "llvm/iPHINode.h"
22781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner#include "llvm/Type.h"
23781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner#include "llvm/Assembly/Writer.h"
24781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner#include "llvm/Analysis/InstForest.h"
25781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner#include "llvm/Analysis/Expressions.h"
26781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner#include "llvm/Analysis/InductionVariable.h"
27781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner#include "llvm/Analysis/LoopInfo.h"
28781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner#include "llvm/Support/InstIterator.h"
29781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner
30781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattnernamespace {
31781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner  struct InstForestHelper : public FunctionPass {
32781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner    Function *F;
33781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner    virtual bool runOnFunction(Function &Func) { F = &Func; return false; }
34781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner
35781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner    void print(std::ostream &OS) const {
36781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner      std::cout << InstForest<char>(F);
37781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner    }
38781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner
39781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
40781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner      AU.setPreservesAll();
41781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner    }
42781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner  };
43781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner
44781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner  RegisterAnalysis<InstForestHelper> P1("instforest", "InstForest Printer");
45781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner
46781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner  struct IndVars : public FunctionPass {
47781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner    Function *F;
48781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner    LoopInfo *LI;
49781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner    virtual bool runOnFunction(Function &Func) {
50781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner      F = &Func; LI = &getAnalysis<LoopInfo>();
51781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner      return false;
52781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner    }
53781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner
54781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner    void print(std::ostream &OS) const {
55781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner      for (inst_iterator I = inst_begin(*F), E = inst_end(*F); I != E; ++I)
56781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner        if (PHINode *PN = dyn_cast<PHINode>(*I)) {
57781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner          InductionVariable IV(PN, LI);
58781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner          if (IV.InductionType != InductionVariable::Unknown)
59781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner            IV.print(OS);
60781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner        }
61781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner    }
62781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner
63781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner    void getAnalysisUsage(AnalysisUsage &AU) const {
645f0eb8da62308126d5b61e3eee5bee75b9dc5194Chris Lattner      AU.addRequired<LoopInfo>();
65781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner      AU.setPreservesAll();
66781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner    }
67781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner  };
68781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner
69781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner  RegisterAnalysis<IndVars> P6("indvars", "Induction Variable Analysis");
70781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner
71781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner
72781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner  struct Exprs : public FunctionPass {
73781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner    Function *F;
74781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner    virtual bool runOnFunction(Function &Func) { F = &Func; return false; }
75781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner
76781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner    void print(std::ostream &OS) const {
77781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner      OS << "Classified expressions for: " << F->getName() << "\n";
78781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner      for (inst_iterator I = inst_begin(*F), E = inst_end(*F); I != E; ++I) {
79781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner        OS << *I;
80781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner
81781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner        if ((*I)->getType() == Type::VoidTy) continue;
82c74cb8698f1771603a6ab008277a407c55e47753Chris Lattner        ExprType R = ClassifyExpression(*I);
83781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner        if (R.Var == *I) continue;  // Doesn't tell us anything
84781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner
85781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner        OS << "\t\tExpr =";
86781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner        switch (R.ExprTy) {
87c74cb8698f1771603a6ab008277a407c55e47753Chris Lattner        case ExprType::ScaledLinear:
88781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner          WriteAsOperand(OS << "(", (Value*)R.Scale) << " ) *";
89781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner          // fall through
90c74cb8698f1771603a6ab008277a407c55e47753Chris Lattner        case ExprType::Linear:
91781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner          WriteAsOperand(OS << "(", R.Var) << " )";
92781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner          if (R.Offset == 0) break;
93781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner          else OS << " +";
94781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner          // fall through
95c74cb8698f1771603a6ab008277a407c55e47753Chris Lattner        case ExprType::Constant:
96781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner          if (R.Offset) WriteAsOperand(OS, (Value*)R.Offset);
97781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner          else OS << " 0";
98781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner          break;
99781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner        }
100781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner        OS << "\n\n";
101781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner      }
102781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner    }
103781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
104781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner      AU.setPreservesAll();
105781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner    }
106781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner  };
107781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner
108781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner  RegisterAnalysis<Exprs> P7("exprs", "Expression Printer");
109781e6f5f894175a48e21c7b9d443616a7428f1f7Chris Lattner}
110