blob: 5b1864a37629783bdcba8afeb76f17b0c2243c98 [file] [log] [blame]
//===- RegionPass.h - RegionPass class --------------------------*- C++ -*-===//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
// 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.
#include "llvm/Analysis/RegionInfo.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/LegacyPassManagers.h"
#include "llvm/Pass.h"
#include <deque>
namespace llvm {
class RGPassManager;
class Function;
/// A pass that runs on each Region in a function.
/// RegionPass is managed by RGPassManager.
class RegionPass : public Pass {
explicit RegionPass(char &pid) : Pass(PT_Region, pid) {}
/// @name To be implemented by every RegionPass
/// 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;
/// Get a pass to print the LLVM IR in the region.
/// @param O The output stream to print the Region.
/// @param Banner The banner to separate different printed passes.
/// @return The pass to print the LLVM IR in the region.
Pass *createPrinterPass(raw_ostream &O,
const std::string &Banner) const override;
using llvm::Pass::doInitialization;
using llvm::Pass::doFinalization;
virtual bool doInitialization(Region *R, RGPassManager &RGM) { return false; }
virtual bool doFinalization() { return false; }
/// @name PassManager API
void preparePassManager(PMStack &PMS) override;
void assignPassManager(PMStack &PMS,
PassManagerType PMT = PMT_RegionPassManager) override;
PassManagerType getPotentialPassManagerType() const override {
return PMT_RegionPassManager;
/// Optional passes call this function to check whether the pass should be
/// skipped. This is the case when optimization bisect is over the limit.
bool skipRegion(Region &R) const;
/// The pass manager to schedule RegionPasses.
class RGPassManager : public FunctionPass, public PMDataManager {
std::deque<Region*> RQ;
bool skipThisRegion;
bool redoThisRegion;
RegionInfo *RI;
Region *CurrentRegion;
static char ID;
explicit RGPassManager();
/// Execute all of the passes scheduled for execution.
/// @return True if any of the passes modifies the function.
bool runOnFunction(Function &F) override;
/// Pass Manager itself does not invalidate any analysis info.
/// RGPassManager needs RegionInfo.
void getAnalysisUsage(AnalysisUsage &Info) const override;
StringRef getPassName() const override { return "Region Pass Manager"; }
PMDataManager *getAsPMDataManager() override { return this; }
Pass *getAsPass() override { return this; }
/// Print passes managed by this manager.
void dumpPassStructure(unsigned Offset) override;
/// Get 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;
PassManagerType getPassManagerType() const override {
return PMT_RegionPassManager;
} // End llvm namespace