Home | History | Annotate | Download | only in CodeGen
      1 //===-- Passes.h - Target independent code generation passes ----*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file defines interfaces to access the target independent code generation
     11 // passes provided by the LLVM backend.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 #ifndef LLVM_CODEGEN_PASSES_H
     16 #define LLVM_CODEGEN_PASSES_H
     17 
     18 #include "llvm/Pass.h"
     19 #include "llvm/Target/TargetMachine.h"
     20 #include <string>
     21 
     22 namespace llvm {
     23 
     24   class FunctionPass;
     25   class MachineFunctionPass;
     26   class PassInfo;
     27   class TargetLowering;
     28   class TargetRegisterClass;
     29   class raw_ostream;
     30 }
     31 
     32 namespace llvm {
     33 
     34 extern char &NoPassID; // Allow targets to choose not to run a pass.
     35 
     36 class PassConfigImpl;
     37 
     38 /// Target-Independent Code Generator Pass Configuration Options.
     39 ///
     40 /// This is an ImmutablePass solely for the purpose of exposing CodeGen options
     41 /// to the internals of other CodeGen passes.
     42 class TargetPassConfig : public ImmutablePass {
     43 public:
     44   /// Pseudo Pass IDs. These are defined within TargetPassConfig because they
     45   /// are unregistered pass IDs. They are only useful for use with
     46   /// TargetPassConfig APIs to identify multiple occurrences of the same pass.
     47   ///
     48 
     49   /// EarlyTailDuplicate - A clone of the TailDuplicate pass that runs early
     50   /// during codegen, on SSA form.
     51   static char EarlyTailDuplicateID;
     52 
     53   /// PostRAMachineLICM - A clone of the LICM pass that runs during late machine
     54   /// optimization after regalloc.
     55   static char PostRAMachineLICMID;
     56 
     57 protected:
     58   TargetMachine *TM;
     59   PassManagerBase &PM;
     60   PassConfigImpl *Impl; // Internal data structures
     61   bool Initialized;     // Flagged after all passes are configured.
     62 
     63   // Target Pass Options
     64   // Targets provide a default setting, user flags override.
     65   //
     66   bool DisableVerify;
     67 
     68   /// Default setting for -enable-tail-merge on this target.
     69   bool EnableTailMerge;
     70 
     71 public:
     72   TargetPassConfig(TargetMachine *tm, PassManagerBase &pm);
     73   // Dummy constructor.
     74   TargetPassConfig();
     75 
     76   virtual ~TargetPassConfig();
     77 
     78   static char ID;
     79 
     80   /// Get the right type of TargetMachine for this target.
     81   template<typename TMC> TMC &getTM() const {
     82     return *static_cast<TMC*>(TM);
     83   }
     84 
     85   const TargetLowering *getTargetLowering() const {
     86     return TM->getTargetLowering();
     87   }
     88 
     89   //
     90   void setInitialized() { Initialized = true; }
     91 
     92   CodeGenOpt::Level getOptLevel() const { return TM->getOptLevel(); }
     93 
     94   void setDisableVerify(bool Disable) { setOpt(DisableVerify, Disable); }
     95 
     96   bool getEnableTailMerge() const { return EnableTailMerge; }
     97   void setEnableTailMerge(bool Enable) { setOpt(EnableTailMerge, Enable); }
     98 
     99   /// Allow the target to override a specific pass without overriding the pass
    100   /// pipeline. When passes are added to the standard pipeline at the
    101   /// point where StadardID is expected, add TargetID in its place.
    102   void substitutePass(char &StandardID, char &TargetID);
    103 
    104   /// Allow the target to enable a specific standard pass by default.
    105   void enablePass(char &ID) { substitutePass(ID, ID); }
    106 
    107   /// Allow the target to disable a specific standard pass by default.
    108   void disablePass(char &ID) { substitutePass(ID, NoPassID); }
    109 
    110   /// Return the pass ssubtituted for StandardID by the target.
    111   /// If no substitution exists, return StandardID.
    112   AnalysisID getPassSubstitution(AnalysisID StandardID) const;
    113 
    114   /// Return true if the optimized regalloc pipeline is enabled.
    115   bool getOptimizeRegAlloc() const;
    116 
    117   /// Add common target configurable passes that perform LLVM IR to IR
    118   /// transforms following machine independent optimization.
    119   virtual void addIRPasses();
    120 
    121   /// Add common passes that perform LLVM IR to IR transforms in preparation for
    122   /// instruction selection.
    123   virtual void addISelPrepare();
    124 
    125   /// addInstSelector - This method should install an instruction selector pass,
    126   /// which converts from LLVM code to machine instructions.
    127   virtual bool addInstSelector() {
    128     return true;
    129   }
    130 
    131   /// Add the complete, standard set of LLVM CodeGen passes.
    132   /// Fully developed targets will not generally override this.
    133   virtual void addMachinePasses();
    134 
    135 protected:
    136   // Helper to verify the analysis is really immutable.
    137   void setOpt(bool &Opt, bool Val);
    138 
    139   /// Methods with trivial inline returns are convenient points in the common
    140   /// codegen pass pipeline where targets may insert passes. Methods with
    141   /// out-of-line standard implementations are major CodeGen stages called by
    142   /// addMachinePasses. Some targets may override major stages when inserting
    143   /// passes is insufficient, but maintaining overriden stages is more work.
    144   ///
    145 
    146   /// addPreISelPasses - This method should add any "last minute" LLVM->LLVM
    147   /// passes (which are run just before instruction selector).
    148   virtual bool addPreISel() {
    149     return true;
    150   }
    151 
    152   /// addMachineSSAOptimization - Add standard passes that optimize machine
    153   /// instructions in SSA form.
    154   virtual void addMachineSSAOptimization();
    155 
    156   /// addPreRegAlloc - This method may be implemented by targets that want to
    157   /// run passes immediately before register allocation. This should return
    158   /// true if -print-machineinstrs should print after these passes.
    159   virtual bool addPreRegAlloc() {
    160     return false;
    161   }
    162 
    163   /// createTargetRegisterAllocator - Create the register allocator pass for
    164   /// this target at the current optimization level.
    165   virtual FunctionPass *createTargetRegisterAllocator(bool Optimized);
    166 
    167   /// addFastRegAlloc - Add the minimum set of target-independent passes that
    168   /// are required for fast register allocation.
    169   virtual void addFastRegAlloc(FunctionPass *RegAllocPass);
    170 
    171   /// addOptimizedRegAlloc - Add passes related to register allocation.
    172   /// LLVMTargetMachine provides standard regalloc passes for most targets.
    173   virtual void addOptimizedRegAlloc(FunctionPass *RegAllocPass);
    174 
    175   /// addFinalizeRegAlloc - This method may be implemented by targets that want
    176   /// to run passes within the regalloc pipeline, immediately after the register
    177   /// allocation pass itself. These passes run as soon as virtual regisiters
    178   /// have been rewritten to physical registers but before and other postRA
    179   /// optimization happens. Targets that have marked instructions for bundling
    180   /// must have finalized those bundles by the time these passes have run,
    181   /// because subsequent passes are not guaranteed to be bundle-aware.
    182   virtual bool addFinalizeRegAlloc() {
    183     return false;
    184   }
    185 
    186   /// addPostRegAlloc - This method may be implemented by targets that want to
    187   /// run passes after register allocation pass pipeline but before
    188   /// prolog-epilog insertion.  This should return true if -print-machineinstrs
    189   /// should print after these passes.
    190   virtual bool addPostRegAlloc() {
    191     return false;
    192   }
    193 
    194   /// Add passes that optimize machine instructions after register allocation.
    195   virtual void addMachineLateOptimization();
    196 
    197   /// addPreSched2 - This method may be implemented by targets that want to
    198   /// run passes after prolog-epilog insertion and before the second instruction
    199   /// scheduling pass.  This should return true if -print-machineinstrs should
    200   /// print after these passes.
    201   virtual bool addPreSched2() {
    202     return false;
    203   }
    204 
    205   /// Add standard basic block placement passes.
    206   virtual void addBlockPlacement();
    207 
    208   /// addPreEmitPass - This pass may be implemented by targets that want to run
    209   /// passes immediately before machine code is emitted.  This should return
    210   /// true if -print-machineinstrs should print out the code after the passes.
    211   virtual bool addPreEmitPass() {
    212     return false;
    213   }
    214 
    215   /// Utilities for targets to add passes to the pass manager.
    216   ///
    217 
    218   /// Add a CodeGen pass at this point in the pipeline after checking overrides.
    219   /// Return the pass that was added, or NoPassID.
    220   AnalysisID addPass(char &ID);
    221 
    222   /// addMachinePasses helper to create the target-selected or overriden
    223   /// regalloc pass.
    224   FunctionPass *createRegAllocPass(bool Optimized);
    225 
    226   /// printAndVerify - Add a pass to dump then verify the machine function, if
    227   /// those steps are enabled.
    228   ///
    229   void printAndVerify(const char *Banner) const;
    230 };
    231 } // namespace llvm
    232 
    233 /// List of target independent CodeGen pass IDs.
    234 namespace llvm {
    235   /// createUnreachableBlockEliminationPass - The LLVM code generator does not
    236   /// work well with unreachable basic blocks (what live ranges make sense for a
    237   /// block that cannot be reached?).  As such, a code generator should either
    238   /// not instruction select unreachable blocks, or run this pass as its
    239   /// last LLVM modifying pass to clean up blocks that are not reachable from
    240   /// the entry block.
    241   FunctionPass *createUnreachableBlockEliminationPass();
    242 
    243   /// MachineFunctionPrinter pass - This pass prints out the machine function to
    244   /// the given stream as a debugging tool.
    245   MachineFunctionPass *
    246   createMachineFunctionPrinterPass(raw_ostream &OS,
    247                                    const std::string &Banner ="");
    248 
    249   /// MachineLoopInfo - This pass is a loop analysis pass.
    250   extern char &MachineLoopInfoID;
    251 
    252   /// MachineLoopRanges - This pass is an on-demand loop coverage analysis.
    253   extern char &MachineLoopRangesID;
    254 
    255   /// MachineDominators - This pass is a machine dominators analysis pass.
    256   extern char &MachineDominatorsID;
    257 
    258   /// EdgeBundles analysis - Bundle machine CFG edges.
    259   extern char &EdgeBundlesID;
    260 
    261   /// LiveVariables pass - This pass computes the set of blocks in which each
    262   /// variable is life and sets machine operand kill flags.
    263   extern char &LiveVariablesID;
    264 
    265   /// PHIElimination - This pass eliminates machine instruction PHI nodes
    266   /// by inserting copy instructions.  This destroys SSA information, but is the
    267   /// desired input for some register allocators.  This pass is "required" by
    268   /// these register allocator like this: AU.addRequiredID(PHIEliminationID);
    269   extern char &PHIEliminationID;
    270 
    271   /// StrongPHIElimination - This pass eliminates machine instruction PHI
    272   /// nodes by inserting copy instructions.  This destroys SSA information, but
    273   /// is the desired input for some register allocators.  This pass is
    274   /// "required" by these register allocator like this:
    275   ///    AU.addRequiredID(PHIEliminationID);
    276   ///  This pass is still in development
    277   extern char &StrongPHIEliminationID;
    278 
    279   /// LiveStacks pass. An analysis keeping track of the liveness of stack slots.
    280   extern char &LiveStacksID;
    281 
    282   /// TwoAddressInstruction - This pass reduces two-address instructions to
    283   /// use two operands. This destroys SSA information but it is desired by
    284   /// register allocators.
    285   extern char &TwoAddressInstructionPassID;
    286 
    287   /// ProcessImpicitDefs pass - This pass removes IMPLICIT_DEFs.
    288   extern char &ProcessImplicitDefsID;
    289 
    290   /// RegisterCoalescer - This pass merges live ranges to eliminate copies.
    291   extern char &RegisterCoalescerID;
    292 
    293   /// MachineScheduler - This pass schedules machine instructions.
    294   extern char &MachineSchedulerID;
    295 
    296   /// SpillPlacement analysis. Suggest optimal placement of spill code between
    297   /// basic blocks.
    298   extern char &SpillPlacementID;
    299 
    300   /// UnreachableMachineBlockElimination - This pass removes unreachable
    301   /// machine basic blocks.
    302   extern char &UnreachableMachineBlockElimID;
    303 
    304   /// DeadMachineInstructionElim - This pass removes dead machine instructions.
    305   extern char &DeadMachineInstructionElimID;
    306 
    307   /// FastRegisterAllocation Pass - This pass register allocates as fast as
    308   /// possible. It is best suited for debug code where live ranges are short.
    309   ///
    310   FunctionPass *createFastRegisterAllocator();
    311 
    312   /// BasicRegisterAllocation Pass - This pass implements a degenerate global
    313   /// register allocator using the basic regalloc framework.
    314   ///
    315   FunctionPass *createBasicRegisterAllocator();
    316 
    317   /// Greedy register allocation pass - This pass implements a global register
    318   /// allocator for optimized builds.
    319   ///
    320   FunctionPass *createGreedyRegisterAllocator();
    321 
    322   /// PBQPRegisterAllocation Pass - This pass implements the Partitioned Boolean
    323   /// Quadratic Prograaming (PBQP) based register allocator.
    324   ///
    325   FunctionPass *createDefaultPBQPRegisterAllocator();
    326 
    327   /// PrologEpilogCodeInserter - This pass inserts prolog and epilog code,
    328   /// and eliminates abstract frame references.
    329   extern char &PrologEpilogCodeInserterID;
    330 
    331   /// ExpandPostRAPseudos - This pass expands pseudo instructions after
    332   /// register allocation.
    333   extern char &ExpandPostRAPseudosID;
    334 
    335   /// createPostRAScheduler - This pass performs post register allocation
    336   /// scheduling.
    337   extern char &PostRASchedulerID;
    338 
    339   /// BranchFolding - This pass performs machine code CFG based
    340   /// optimizations to delete branches to branches, eliminate branches to
    341   /// successor blocks (creating fall throughs), and eliminating branches over
    342   /// branches.
    343   extern char &BranchFolderPassID;
    344 
    345   /// TailDuplicate - Duplicate blocks with unconditional branches
    346   /// into tails of their predecessors.
    347   extern char &TailDuplicateID;
    348 
    349   /// IfConverter - This pass performs machine code if conversion.
    350   extern char &IfConverterID;
    351 
    352   /// MachineBlockPlacement - This pass places basic blocks based on branch
    353   /// probabilities.
    354   extern char &MachineBlockPlacementID;
    355 
    356   /// MachineBlockPlacementStats - This pass collects statistics about the
    357   /// basic block placement using branch probabilities and block frequency
    358   /// information.
    359   extern char &MachineBlockPlacementStatsID;
    360 
    361   /// Code Placement - This pass optimize code placement and aligns loop
    362   /// headers to target specific alignment boundary.
    363   extern char &CodePlacementOptID;
    364 
    365   /// GCLowering Pass - Performs target-independent LLVM IR transformations for
    366   /// highly portable strategies.
    367   ///
    368   FunctionPass *createGCLoweringPass();
    369 
    370   /// GCMachineCodeAnalysis - Target-independent pass to mark safe points
    371   /// in machine code. Must be added very late during code generation, just
    372   /// prior to output, and importantly after all CFG transformations (such as
    373   /// branch folding).
    374   extern char &GCMachineCodeAnalysisID;
    375 
    376   /// Deleter Pass - Releases GC metadata.
    377   ///
    378   FunctionPass *createGCInfoDeleter();
    379 
    380   /// Creates a pass to print GC metadata.
    381   ///
    382   FunctionPass *createGCInfoPrinter(raw_ostream &OS);
    383 
    384   /// MachineCSE - This pass performs global CSE on machine instructions.
    385   extern char &MachineCSEID;
    386 
    387   /// MachineLICM - This pass performs LICM on machine instructions.
    388   extern char &MachineLICMID;
    389 
    390   /// MachineSinking - This pass performs sinking on machine instructions.
    391   extern char &MachineSinkingID;
    392 
    393   /// MachineCopyPropagation - This pass performs copy propagation on
    394   /// machine instructions.
    395   extern char &MachineCopyPropagationID;
    396 
    397   /// PeepholeOptimizer - This pass performs peephole optimizations -
    398   /// like extension and comparison eliminations.
    399   extern char &PeepholeOptimizerID;
    400 
    401   /// OptimizePHIs - This pass optimizes machine instruction PHIs
    402   /// to take advantage of opportunities created during DAG legalization.
    403   extern char &OptimizePHIsID;
    404 
    405   /// StackSlotColoring - This pass performs stack slot coloring.
    406   extern char &StackSlotColoringID;
    407 
    408   /// createStackProtectorPass - This pass adds stack protectors to functions.
    409   ///
    410   FunctionPass *createStackProtectorPass(const TargetLowering *tli);
    411 
    412   /// createMachineVerifierPass - This pass verifies cenerated machine code
    413   /// instructions for correctness.
    414   ///
    415   FunctionPass *createMachineVerifierPass(const char *Banner = 0);
    416 
    417   /// createDwarfEHPass - This pass mulches exception handling code into a form
    418   /// adapted to code generation.  Required if using dwarf exception handling.
    419   FunctionPass *createDwarfEHPass(const TargetMachine *tm);
    420 
    421   /// createSjLjEHPreparePass - This pass adapts exception handling code to use
    422   /// the GCC-style builtin setjmp/longjmp (sjlj) to handling EH control flow.
    423   ///
    424   FunctionPass *createSjLjEHPreparePass(const TargetLowering *tli);
    425 
    426   /// LocalStackSlotAllocation - This pass assigns local frame indices to stack
    427   /// slots relative to one another and allocates base registers to access them
    428   /// when it is estimated by the target to be out of range of normal frame
    429   /// pointer or stack pointer index addressing.
    430   extern char &LocalStackSlotAllocationID;
    431 
    432   /// ExpandISelPseudos - This pass expands pseudo-instructions.
    433   extern char &ExpandISelPseudosID;
    434 
    435   /// createExecutionDependencyFixPass - This pass fixes execution time
    436   /// problems with dependent instructions, such as switching execution
    437   /// domains to match.
    438   ///
    439   /// The pass will examine instructions using and defining registers in RC.
    440   ///
    441   FunctionPass *createExecutionDependencyFixPass(const TargetRegisterClass *RC);
    442 
    443   /// UnpackMachineBundles - This pass unpack machine instruction bundles.
    444   extern char &UnpackMachineBundlesID;
    445 
    446   /// FinalizeMachineBundles - This pass finalize machine instruction
    447   /// bundles (created earlier, e.g. during pre-RA scheduling).
    448   extern char &FinalizeMachineBundlesID;
    449 
    450 } // End llvm namespace
    451 
    452 #endif
    453