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