mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-02 00:42:52 +01:00
88ce93b0eb
A RegionPass is executed like a LoopPass but on the regions detected by the RegionInfo pass instead of the loops detected by the LoopInfo pass. llvm-svn: 116905
127 lines
3.7 KiB
C++
127 lines
3.7 KiB
C++
//===- RegionPass.h - RegionPass class ------------------------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file defines the RegionPass class. All region based analysis,
|
|
// optimization and transformation passes are derived from RegionPass.
|
|
// This class is implemented following the some ideas of the LoopPass.h class.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_REGION_PASS_H
|
|
#define LLVM_REGION_PASS_H
|
|
|
|
#include "llvm/Analysis/RegionInfo.h"
|
|
|
|
#include "llvm/Pass.h"
|
|
#include "llvm/PassManagers.h"
|
|
#include "llvm/Function.h"
|
|
|
|
#include <deque>
|
|
|
|
namespace llvm {
|
|
|
|
class RGPassManager;
|
|
class Function;
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
/// @brief A pass that runs on each Region in a function.
|
|
///
|
|
/// RegionPass is managed by RGPassManager.
|
|
class RegionPass : public Pass {
|
|
public:
|
|
explicit RegionPass(char &pid) : Pass(PT_Region, pid) {}
|
|
|
|
//===--------------------------------------------------------------------===//
|
|
/// @name To be implemented by every RegionPass
|
|
///
|
|
//@{
|
|
/// @brief Run the pass on a specific Region
|
|
///
|
|
/// Accessing regions not contained in the current region is not allowed.
|
|
///
|
|
/// @param R The region this pass is run on.
|
|
/// @param RGM The RegionPassManager that manages this Pass.
|
|
///
|
|
/// @return True if the pass modifies this Region.
|
|
virtual bool runOnRegion(Region *R, RGPassManager &RGM) = 0;
|
|
|
|
/// @brief Get a pass to print the LLVM IR in the region.
|
|
///
|
|
/// @param O The ouput stream to print the Region.
|
|
/// @param Banner The banner to seperate different printed passes.
|
|
///
|
|
/// @return The pass to print the LLVM IR in the region.
|
|
Pass *createPrinterPass(raw_ostream &O, const std::string &Banner) const;
|
|
|
|
virtual bool doInitialization(Region *R, RGPassManager &RGM) { return false; }
|
|
virtual bool doFinalization() { return false; }
|
|
//@}
|
|
|
|
//===--------------------------------------------------------------------===//
|
|
/// @name PassManager API
|
|
///
|
|
//@{
|
|
void preparePassManager(PMStack &PMS);
|
|
|
|
virtual void assignPassManager(PMStack &PMS,
|
|
PassManagerType PMT = PMT_RegionPassManager);
|
|
|
|
virtual PassManagerType getPotentialPassManagerType() const {
|
|
return PMT_RegionPassManager;
|
|
}
|
|
//@}
|
|
};
|
|
|
|
/// @brief The pass manager to schedule RegionPasses.
|
|
class RGPassManager : public FunctionPass, public PMDataManager {
|
|
std::deque<Region*> RQ;
|
|
bool skipThisRegion;
|
|
bool redoThisRegion;
|
|
RegionInfo *RI;
|
|
Region *CurrentRegion;
|
|
|
|
public:
|
|
static char ID;
|
|
explicit RGPassManager(int Depth);
|
|
|
|
/// @brief Execute all of the passes scheduled for execution.
|
|
///
|
|
/// @return True if any of the passes modifies the function.
|
|
bool runOnFunction(Function &F);
|
|
|
|
/// Pass Manager itself does not invalidate any analysis info.
|
|
/// RGPassManager needs RegionInfo.
|
|
void getAnalysisUsage(AnalysisUsage &Info) const;
|
|
|
|
virtual const char *getPassName() const {
|
|
return "Region Pass Manager";
|
|
}
|
|
|
|
virtual PMDataManager *getAsPMDataManager() { return this; }
|
|
virtual Pass *getAsPass() { return this; }
|
|
|
|
/// @brief Print passes managed by this manager.
|
|
void dumpPassStructure(unsigned Offset);
|
|
|
|
/// @brief Print passes contained by this manager.
|
|
Pass *getContainedPass(unsigned N) {
|
|
assert(N < PassVector.size() && "Pass number out of range!");
|
|
Pass *FP = static_cast<Pass *>(PassVector[N]);
|
|
return FP;
|
|
}
|
|
|
|
virtual PassManagerType getPassManagerType() const {
|
|
return PMT_RegionPassManager;
|
|
}
|
|
};
|
|
|
|
} // End llvm namespace
|
|
|
|
#endif
|