LoopPass.h revision bd4d66d56a4e761a206dac14ccff4d37139d9ad9
1ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski//===- LoopPass.h - LoopPass class ----------------------------------------===// 2ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski// 3ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski// The LLVM Compiler Infrastructure 4ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski// 5ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski// This file is distributed under the University of Illinois Open Source 6ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski// License. See LICENSE.TXT for details. 7ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski// 8ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski//===----------------------------------------------------------------------===// 9ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski// 10ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski// This file defines LoopPass class. All loop optimization 11ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski// and transformation passes are derived from LoopPass. 12ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski// 13ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski//===----------------------------------------------------------------------===// 14ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 15ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski#ifndef LLVM_LOOP_PASS_H 16ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski#define LLVM_LOOP_PASS_H 17ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 18ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski#include "llvm/Analysis/LoopInfo.h" 19ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski#include "llvm/Pass.h" 20ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski#include "llvm/PassManagers.h" 21ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski#include "llvm/Function.h" 22ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski#include <deque> 23ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 24ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskinamespace llvm { 25ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 26ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskiclass LPPassManager; 27ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskiclass Function; 28ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskiclass PMStack; 29ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 30ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskiclass LoopPass : public Pass { 31ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskipublic: 32ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski explicit LoopPass(char &pid) : Pass(PT_Loop, pid) {} 33ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 34ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski /// getPrinterPass - Get a pass to print the function corresponding 35ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski /// to a Loop. 36ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski Pass *createPrinterPass(raw_ostream &O, const std::string &Banner) const; 37ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 38ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // runOnLoop - This method should be implemented by the subclass to perform 39ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // whatever action is necessary for the specified Loop. 40ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski virtual bool runOnLoop(Loop *L, LPPassManager &LPM) = 0; 41ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 42ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Initialization and finalization hooks. 43ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski virtual bool doInitialization(Loop *L, LPPassManager &LPM) { 44ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski return false; 45ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 46ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 47ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Finalization hook does not supply Loop because at this time 48ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // loop nest is completely different. 49ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski virtual bool doFinalization() { return false; } 50ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 51ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Check if this pass is suitable for the current LPPassManager, if 52ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // available. This pass P is not suitable for a LPPassManager if P 53ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // is not preserving higher level analysis info used by other 54ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // LPPassManager passes. In such case, pop LPPassManager from the 55ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // stack. This will force assignPassManager() to create new 56ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // LPPassManger as expected. 57ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski void preparePassManager(PMStack &PMS); 58ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 59ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski /// Assign pass manager to manage this pass 60ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski virtual void assignPassManager(PMStack &PMS, 61ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski PassManagerType PMT); 62ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 63ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski /// Return what kind of Pass Manager can manage this pass. 64ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski virtual PassManagerType getPotentialPassManagerType() const { 65ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski return PMT_LoopPassManager; 66ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 67ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 68ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski //===--------------------------------------------------------------------===// 69ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski /// SimpleAnalysis - Provides simple interface to update analysis info 70ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski /// maintained by various passes. Note, if required this interface can 71ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski /// be extracted into a separate abstract class but it would require 72ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski /// additional use of multiple inheritance in Pass class hierarchy, something 73ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski /// we are trying to avoid. 74ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 75ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski /// Each loop pass can override these simple analysis hooks to update 76ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski /// desired analysis information. 77ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski /// cloneBasicBlockAnalysis - Clone analysis info associated with basic block. 78ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski virtual void cloneBasicBlockAnalysis(BasicBlock *F, BasicBlock *T, Loop *L) {} 79ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 80ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski /// deleteAnalysisValue - Delete analysis info associated with value V. 81ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski virtual void deleteAnalysisValue(Value *V, Loop *L) {} 82ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski}; 83ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 84ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskiclass LPPassManager : public FunctionPass, public PMDataManager { 85ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskipublic: 86ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski static char ID; 87ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski explicit LPPassManager(int Depth); 88ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 89ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski /// run - Execute all of the passes scheduled for execution. Keep track of 90ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski /// whether any of the passes modifies the module, and if so, return true. 91ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski bool runOnFunction(Function &F); 92ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 93ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski /// Pass Manager itself does not invalidate any analysis info. 94ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // LPPassManager needs LoopInfo. 95ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski void getAnalysisUsage(AnalysisUsage &Info) const; 96ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 97ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski virtual const char *getPassName() const { 98ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski return "Loop Pass Manager"; 99ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 100ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 101ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski virtual PMDataManager *getAsPMDataManager() { return this; } 102ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski virtual Pass *getAsPass() { return this; } 103ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 104ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski /// Print passes managed by this manager 105ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski void dumpPassStructure(unsigned Offset); 106ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 107ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski LoopPass *getContainedPass(unsigned N) { 108ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assert(N < PassVector.size() && "Pass number out of range!"); 109ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski LoopPass *LP = static_cast<LoopPass *>(PassVector[N]); 110ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski return LP; 111ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 112ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 113ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski virtual PassManagerType getPassManagerType() const { 114ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski return PMT_LoopPassManager; 115ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 116ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 117ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskipublic: 118ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Delete loop from the loop queue and loop nest (LoopInfo). 119ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski void deleteLoopFromQueue(Loop *L); 120ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 121ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Insert loop into the loop queue and add it as a child of the 122ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // given parent. 123ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski void insertLoop(Loop *L, Loop *ParentLoop); 124ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 125ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Insert a loop into the loop queue. 126ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski void insertLoopIntoQueue(Loop *L); 127ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 128ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Reoptimize this loop. LPPassManager will re-insert this loop into the 129ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // queue. This allows LoopPass to change loop nest for the loop. This 130ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // utility may send LPPassManager into infinite loops so use caution. 131ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski void redoLoop(Loop *L); 132ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 133ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski //===--------------------------------------------------------------------===// 134ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski /// SimpleAnalysis - Provides simple interface to update analysis info 135ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski /// maintained by various passes. Note, if required this interface can 136ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski /// be extracted into a separate abstract class but it would require 137ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski /// additional use of multiple inheritance in Pass class hierarchy, something 138ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski /// we are trying to avoid. 139ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 140ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski /// cloneBasicBlockSimpleAnalysis - Invoke cloneBasicBlockAnalysis hook for 141ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski /// all passes that implement simple analysis interface. 142ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski void cloneBasicBlockSimpleAnalysis(BasicBlock *From, BasicBlock *To, Loop *L); 143ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 144ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski /// deleteSimpleAnalysisValue - Invoke deleteAnalysisValue hook for all passes 145ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski /// that implement simple analysis interface. 146ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski void deleteSimpleAnalysisValue(Value *V, Loop *L); 147ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 148ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskiprivate: 149ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski std::deque<Loop *> LQ; 150ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski bool skipThisLoop; 151ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski bool redoThisLoop; 152ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski LoopInfo *LI; 153ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski Loop *CurrentLoop; 154ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski}; 155ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 156ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski} // End llvm namespace 157ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 158ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski#endif 159ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski