Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //===- RegionPass.h - RegionPass class --------------------------*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // This file defines the RegionPass class. All region based analysis,
  10. // optimization and transformation passes are derived from RegionPass.
  11. // This class is implemented following the some ideas of the LoopPass.h class.
  12. //
  13. //===----------------------------------------------------------------------===//
  14.  
  15. #ifndef LLVM_ANALYSIS_REGIONPASS_H
  16. #define LLVM_ANALYSIS_REGIONPASS_H
  17.  
  18. #include "llvm/IR/LegacyPassManagers.h"
  19. #include "llvm/Pass.h"
  20. #include <deque>
  21.  
  22. namespace llvm {
  23. class Function;
  24. class RGPassManager;
  25. class Region;
  26. class RegionInfo;
  27.  
  28. //===----------------------------------------------------------------------===//
  29. /// A pass that runs on each Region in a function.
  30. ///
  31. /// RegionPass is managed by RGPassManager.
  32. class RegionPass : public Pass {
  33. public:
  34.   explicit RegionPass(char &pid) : Pass(PT_Region, pid) {}
  35.  
  36.   //===--------------------------------------------------------------------===//
  37.   /// @name To be implemented by every RegionPass
  38.   ///
  39.   //@{
  40.   /// Run the pass on a specific Region
  41.   ///
  42.   /// Accessing regions not contained in the current region is not allowed.
  43.   ///
  44.   /// @param R The region this pass is run on.
  45.   /// @param RGM The RegionPassManager that manages this Pass.
  46.   ///
  47.   /// @return True if the pass modifies this Region.
  48.   virtual bool runOnRegion(Region *R, RGPassManager &RGM) = 0;
  49.  
  50.   /// Get a pass to print the LLVM IR in the region.
  51.   ///
  52.   /// @param O      The output stream to print the Region.
  53.   /// @param Banner The banner to separate different printed passes.
  54.   ///
  55.   /// @return The pass to print the LLVM IR in the region.
  56.   Pass *createPrinterPass(raw_ostream &O,
  57.                           const std::string &Banner) const override;
  58.  
  59.   using llvm::Pass::doInitialization;
  60.   using llvm::Pass::doFinalization;
  61.  
  62.   virtual bool doInitialization(Region *R, RGPassManager &RGM) { return false; }
  63.   virtual bool doFinalization() { return false; }
  64.   //@}
  65.  
  66.   //===--------------------------------------------------------------------===//
  67.   /// @name PassManager API
  68.   ///
  69.   //@{
  70.   void preparePassManager(PMStack &PMS) override;
  71.  
  72.   void assignPassManager(PMStack &PMS,
  73.                          PassManagerType PMT = PMT_RegionPassManager) override;
  74.  
  75.   PassManagerType getPotentialPassManagerType() const override {
  76.     return PMT_RegionPassManager;
  77.   }
  78.   //@}
  79.  
  80. protected:
  81.   /// Optional passes call this function to check whether the pass should be
  82.   /// skipped. This is the case when optimization bisect is over the limit.
  83.   bool skipRegion(Region &R) const;
  84. };
  85.  
  86. /// The pass manager to schedule RegionPasses.
  87. class RGPassManager : public FunctionPass, public PMDataManager {
  88.   std::deque<Region*> RQ;
  89.   RegionInfo *RI;
  90.   Region *CurrentRegion;
  91.  
  92. public:
  93.   static char ID;
  94.   explicit RGPassManager();
  95.  
  96.   /// Execute all of the passes scheduled for execution.
  97.   ///
  98.   /// @return True if any of the passes modifies the function.
  99.   bool runOnFunction(Function &F) override;
  100.  
  101.   /// Pass Manager itself does not invalidate any analysis info.
  102.   /// RGPassManager needs RegionInfo.
  103.   void getAnalysisUsage(AnalysisUsage &Info) const override;
  104.  
  105.   StringRef getPassName() const override { return "Region Pass Manager"; }
  106.  
  107.   PMDataManager *getAsPMDataManager() override { return this; }
  108.   Pass *getAsPass() override { return this; }
  109.  
  110.   /// Print passes managed by this manager.
  111.   void dumpPassStructure(unsigned Offset) override;
  112.  
  113.   /// Get passes contained by this manager.
  114.   Pass *getContainedPass(unsigned N) {
  115.     assert(N < PassVector.size() && "Pass number out of range!");
  116.     Pass *FP = static_cast<Pass *>(PassVector[N]);
  117.     return FP;
  118.   }
  119.  
  120.   PassManagerType getPassManagerType() const override {
  121.     return PMT_RegionPassManager;
  122.   }
  123. };
  124.  
  125. } // End llvm namespace
  126.  
  127. #endif
  128.