| //===-- Passes.h - Target independent code generation passes ----*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file defines interfaces to access the target independent code generation |
| // passes provided by the LLVM backend. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_CODEGEN_PASSES_H |
| #define LLVM_CODEGEN_PASSES_H |
| |
| #include "llvm/Target/TargetMachine.h" |
| #include <string> |
| |
| namespace llvm { |
| |
| class FunctionPass; |
| class MachineFunctionPass; |
| class PassInfo; |
| class TargetLowering; |
| class TargetRegisterClass; |
| class raw_ostream; |
| |
| /// createUnreachableBlockEliminationPass - The LLVM code generator does not |
| /// work well with unreachable basic blocks (what live ranges make sense for a |
| /// block that cannot be reached?). As such, a code generator should either |
| /// not instruction select unreachable blocks, or run this pass as its |
| /// last LLVM modifying pass to clean up blocks that are not reachable from |
| /// the entry block. |
| FunctionPass *createUnreachableBlockEliminationPass(); |
| |
| /// MachineFunctionPrinter pass - This pass prints out the machine function to |
| /// the given stream as a debugging tool. |
| MachineFunctionPass * |
| createMachineFunctionPrinterPass(raw_ostream &OS, |
| const std::string &Banner =""); |
| |
| /// MachineLoopInfo pass - This pass is a loop analysis pass. |
| /// |
| extern char &MachineLoopInfoID; |
| |
| /// MachineLoopRanges pass - This pass is an on-demand loop coverage |
| /// analysis pass. |
| /// |
| extern char &MachineLoopRangesID; |
| |
| /// MachineDominators pass - This pass is a machine dominators analysis pass. |
| /// |
| extern char &MachineDominatorsID; |
| |
| /// EdgeBundles analysis - Bundle machine CFG edges. |
| /// |
| extern char &EdgeBundlesID; |
| |
| /// PHIElimination pass - This pass eliminates machine instruction PHI nodes |
| /// by inserting copy instructions. This destroys SSA information, but is the |
| /// desired input for some register allocators. This pass is "required" by |
| /// these register allocator like this: AU.addRequiredID(PHIEliminationID); |
| /// |
| extern char &PHIEliminationID; |
| |
| /// StrongPHIElimination pass - This pass eliminates machine instruction PHI |
| /// nodes by inserting copy instructions. This destroys SSA information, but |
| /// is the desired input for some register allocators. This pass is |
| /// "required" by these register allocator like this: |
| /// AU.addRequiredID(PHIEliminationID); |
| /// This pass is still in development |
| extern char &StrongPHIEliminationID; |
| |
| /// LiveStacks pass. An analysis keeping track of the liveness of stack slots. |
| extern char &LiveStacksID; |
| |
| /// TwoAddressInstruction pass - This pass reduces two-address instructions to |
| /// use two operands. This destroys SSA information but it is desired by |
| /// register allocators. |
| extern char &TwoAddressInstructionPassID; |
| |
| /// RegisteCoalescer pass - This pass merges live ranges to eliminate copies. |
| extern char &RegisterCoalescerPassID; |
| |
| /// SpillPlacement analysis. Suggest optimal placement of spill code between |
| /// basic blocks. |
| /// |
| extern char &SpillPlacementID; |
| |
| /// UnreachableMachineBlockElimination pass - This pass removes unreachable |
| /// machine basic blocks. |
| extern char &UnreachableMachineBlockElimID; |
| |
| /// DeadMachineInstructionElim pass - This pass removes dead machine |
| /// instructions. |
| /// |
| FunctionPass *createDeadMachineInstructionElimPass(); |
| |
| /// Creates a register allocator as the user specified on the command line, or |
| /// picks one that matches OptLevel. |
| /// |
| FunctionPass *createRegisterAllocator(CodeGenOpt::Level OptLevel); |
| |
| /// FastRegisterAllocation Pass - This pass register allocates as fast as |
| /// possible. It is best suited for debug code where live ranges are short. |
| /// |
| FunctionPass *createFastRegisterAllocator(); |
| |
| /// BasicRegisterAllocation Pass - This pass implements a degenerate global |
| /// register allocator using the basic regalloc framework. |
| /// |
| FunctionPass *createBasicRegisterAllocator(); |
| |
| /// Greedy register allocation pass - This pass implements a global register |
| /// allocator for optimized builds. |
| /// |
| FunctionPass *createGreedyRegisterAllocator(); |
| |
| /// LinearScanRegisterAllocation Pass - This pass implements the linear scan |
| /// register allocation algorithm, a global register allocator. |
| /// |
| FunctionPass *createLinearScanRegisterAllocator(); |
| |
| /// PBQPRegisterAllocation Pass - This pass implements the Partitioned Boolean |
| /// Quadratic Prograaming (PBQP) based register allocator. |
| /// |
| FunctionPass *createDefaultPBQPRegisterAllocator(); |
| |
| /// PrologEpilogCodeInserter Pass - This pass inserts prolog and epilog code, |
| /// and eliminates abstract frame references. |
| /// |
| FunctionPass *createPrologEpilogCodeInserter(); |
| |
| /// ExpandPostRAPseudos Pass - This pass expands pseudo instructions after |
| /// register allocation. |
| /// |
| FunctionPass *createExpandPostRAPseudosPass(); |
| |
| /// createPostRAScheduler - This pass performs post register allocation |
| /// scheduling. |
| FunctionPass *createPostRAScheduler(CodeGenOpt::Level OptLevel); |
| |
| /// BranchFolding Pass - This pass performs machine code CFG based |
| /// optimizations to delete branches to branches, eliminate branches to |
| /// successor blocks (creating fall throughs), and eliminating branches over |
| /// branches. |
| FunctionPass *createBranchFoldingPass(bool DefaultEnableTailMerge); |
| |
| /// TailDuplicate Pass - Duplicate blocks with unconditional branches |
| /// into tails of their predecessors. |
| FunctionPass *createTailDuplicatePass(bool PreRegAlloc = false); |
| |
| /// IfConverter Pass - This pass performs machine code if conversion. |
| FunctionPass *createIfConverterPass(); |
| |
| /// Code Placement Pass - This pass optimize code placement and aligns loop |
| /// headers to target specific alignment boundary. |
| FunctionPass *createCodePlacementOptPass(); |
| |
| /// IntrinsicLowering Pass - Performs target-independent LLVM IR |
| /// transformations for highly portable strategies. |
| FunctionPass *createGCLoweringPass(); |
| |
| /// MachineCodeAnalysis Pass - Target-independent pass to mark safe points in |
| /// machine code. Must be added very late during code generation, just prior |
| /// to output, and importantly after all CFG transformations (such as branch |
| /// folding). |
| FunctionPass *createGCMachineCodeAnalysisPass(); |
| |
| /// Deleter Pass - Releases GC metadata. |
| /// |
| FunctionPass *createGCInfoDeleter(); |
| |
| /// Creates a pass to print GC metadata. |
| /// |
| FunctionPass *createGCInfoPrinter(raw_ostream &OS); |
| |
| /// createMachineCSEPass - This pass performs global CSE on machine |
| /// instructions. |
| FunctionPass *createMachineCSEPass(); |
| |
| /// createMachineLICMPass - This pass performs LICM on machine instructions. |
| /// |
| FunctionPass *createMachineLICMPass(bool PreRegAlloc = true); |
| |
| /// createMachineSinkingPass - This pass performs sinking on machine |
| /// instructions. |
| FunctionPass *createMachineSinkingPass(); |
| |
| /// createPeepholeOptimizerPass - This pass performs peephole optimizations - |
| /// like extension and comparison eliminations. |
| FunctionPass *createPeepholeOptimizerPass(); |
| |
| /// createOptimizePHIsPass - This pass optimizes machine instruction PHIs |
| /// to take advantage of opportunities created during DAG legalization. |
| FunctionPass *createOptimizePHIsPass(); |
| |
| /// createStackSlotColoringPass - This pass performs stack slot coloring. |
| FunctionPass *createStackSlotColoringPass(bool); |
| |
| /// createStackProtectorPass - This pass adds stack protectors to functions. |
| FunctionPass *createStackProtectorPass(const TargetLowering *tli); |
| |
| /// createMachineVerifierPass - This pass verifies cenerated machine code |
| /// instructions for correctness. |
| FunctionPass *createMachineVerifierPass(const char *Banner = 0); |
| |
| /// createDwarfEHPass - This pass mulches exception handling code into a form |
| /// adapted to code generation. Required if using dwarf exception handling. |
| FunctionPass *createDwarfEHPass(const TargetMachine *tm); |
| |
| /// createSjLjEHPass - This pass adapts exception handling code to use |
| /// the GCC-style builtin setjmp/longjmp (sjlj) to handling EH control flow. |
| FunctionPass *createSjLjEHPass(const TargetLowering *tli); |
| |
| /// createLocalStackSlotAllocationPass - This pass assigns local frame |
| /// indices to stack slots relative to one another and allocates |
| /// base registers to access them when it is estimated by the target to |
| /// be out of range of normal frame pointer or stack pointer index |
| /// addressing. |
| FunctionPass *createLocalStackSlotAllocationPass(); |
| |
| /// createExpandISelPseudosPass - This pass expands pseudo-instructions. |
| /// |
| FunctionPass *createExpandISelPseudosPass(); |
| |
| /// createExecutionDependencyFixPass - This pass fixes execution time |
| /// problems with dependent instructions, such as switching execution |
| /// domains to match. |
| /// |
| /// The pass will examine instructions using and defining registers in RC. |
| /// |
| FunctionPass *createExecutionDependencyFixPass(const TargetRegisterClass *RC); |
| |
| } // End llvm namespace |
| |
| #endif |