2003-08-22 00:14:26 +02:00
|
|
|
//===-- Passes.h - Target independent code generation passes ----*- C++ -*-===//
|
2005-04-21 22:39:54 +02:00
|
|
|
//
|
2003-10-20 22:19:47 +02:00
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
|
|
|
// This file was developed by the LLVM research group and is distributed under
|
|
|
|
// the University of Illinois Open Source License. See LICENSE.TXT for details.
|
2005-04-21 22:39:54 +02:00
|
|
|
//
|
2003-10-20 22:19:47 +02:00
|
|
|
//===----------------------------------------------------------------------===//
|
2003-01-13 02:01:31 +01:00
|
|
|
//
|
2003-08-22 00:14:26 +02:00
|
|
|
// This file defines interfaces to access the target independent code generation
|
2003-01-13 02:01:31 +01:00
|
|
|
// passes provided by the LLVM backend.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#ifndef LLVM_CODEGEN_PASSES_H
|
|
|
|
#define LLVM_CODEGEN_PASSES_H
|
|
|
|
|
2004-02-04 22:41:10 +01:00
|
|
|
#include <iosfwd>
|
|
|
|
#include <string>
|
2004-01-30 22:53:46 +01:00
|
|
|
|
2003-11-11 23:41:34 +01:00
|
|
|
namespace llvm {
|
|
|
|
|
2003-12-20 11:18:58 +01:00
|
|
|
class FunctionPass;
|
|
|
|
class PassInfo;
|
|
|
|
class TargetMachine;
|
2004-07-02 07:44:13 +02:00
|
|
|
|
|
|
|
/// 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 it can run this pass as it's
|
|
|
|
/// last LLVM modifying pass to clean up blocks that are not reachable from
|
|
|
|
/// the entry block.
|
|
|
|
FunctionPass *createUnreachableBlockEliminationPass();
|
2005-04-21 22:39:54 +02:00
|
|
|
|
2003-12-20 11:18:58 +01:00
|
|
|
/// MachineFunctionPrinter pass - This pass prints out the machine function to
|
|
|
|
/// standard error, as a debugging tool.
|
2004-02-04 22:41:10 +01:00
|
|
|
FunctionPass *createMachineFunctionPrinterPass(std::ostream *OS,
|
2004-01-30 22:53:46 +01:00
|
|
|
const std::string &Banner ="");
|
|
|
|
|
2003-12-20 11:18:58 +01:00
|
|
|
/// 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 const PassInfo *PHIEliminationID;
|
2003-01-13 02:01:31 +01:00
|
|
|
|
2003-12-20 11:18:58 +01:00
|
|
|
/// TwoAddressInstruction pass - This pass reduces two-address instructions to
|
|
|
|
/// use two operands. This destroys SSA information but it is desired by
|
|
|
|
/// register allocators.
|
|
|
|
extern const PassInfo *TwoAddressInstructionPassID;
|
2003-01-13 02:01:31 +01:00
|
|
|
|
2003-12-20 11:18:58 +01:00
|
|
|
/// Creates a register allocator as the user specified on the command line.
|
|
|
|
///
|
|
|
|
FunctionPass *createRegisterAllocator();
|
2003-01-13 02:01:31 +01:00
|
|
|
|
2003-12-20 11:18:58 +01:00
|
|
|
/// SimpleRegisterAllocation Pass - This pass converts the input machine code
|
|
|
|
/// from SSA form to use explicit registers by spilling every register. Wow,
|
|
|
|
/// great policy huh?
|
|
|
|
///
|
|
|
|
FunctionPass *createSimpleRegisterAllocator();
|
2003-11-20 04:32:25 +01:00
|
|
|
|
2003-12-20 11:18:58 +01:00
|
|
|
/// LocalRegisterAllocation Pass - This pass register allocates the input code
|
|
|
|
/// a basic block at a time, yielding code better than the simple register
|
|
|
|
/// allocator, but not as good as a global allocator.
|
2005-04-21 22:39:54 +02:00
|
|
|
///
|
2003-12-20 11:18:58 +01:00
|
|
|
FunctionPass *createLocalRegisterAllocator();
|
2005-04-21 22:39:54 +02:00
|
|
|
|
2003-12-20 11:18:58 +01:00
|
|
|
/// LinearScanRegisterAllocation Pass - This pass implements the linear scan
|
|
|
|
/// register allocation algorithm, a global register allocator.
|
|
|
|
///
|
|
|
|
FunctionPass *createLinearScanRegisterAllocator();
|
2003-01-13 02:01:31 +01:00
|
|
|
|
2003-12-20 11:18:58 +01:00
|
|
|
/// PrologEpilogCodeInserter Pass - This pass inserts prolog and epilog code,
|
|
|
|
/// and eliminates abstract frame references.
|
|
|
|
///
|
|
|
|
FunctionPass *createPrologEpilogCodeInserter();
|
2003-09-30 22:14:43 +02:00
|
|
|
|
2004-07-31 11:59:14 +02:00
|
|
|
/// 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();
|
|
|
|
|
2006-11-07 20:33:46 +01:00
|
|
|
/// DebugLabelFoldingPass - This pass prunes out redundant debug labels. This
|
|
|
|
/// allows a debug emitter to determine if the range of two labels is empty,
|
|
|
|
/// by seeing if the labels map to the same reduced label.
|
|
|
|
FunctionPass *createDebugLabelFoldingPass();
|
|
|
|
|
2003-12-20 11:18:58 +01:00
|
|
|
/// MachineCodeDeletion Pass - This pass deletes all of the machine code for
|
|
|
|
/// the current function, which should happen after the function has been
|
|
|
|
/// emitted to a .s file or to memory.
|
|
|
|
FunctionPass *createMachineCodeDeleter();
|
2005-04-21 22:39:54 +02:00
|
|
|
|
2003-12-20 11:18:58 +01:00
|
|
|
/// getRegisterAllocator - This creates an instance of the register allocator
|
|
|
|
/// for the Sparc.
|
|
|
|
FunctionPass *getRegisterAllocator(TargetMachine &T);
|
2004-05-08 18:14:02 +02:00
|
|
|
|
|
|
|
//createModuloSchedulingPass - Creates the Swing Modulo Scheduling Pass
|
|
|
|
FunctionPass *createModuloSchedulingPass(TargetMachine & targ);
|
|
|
|
|
2005-05-01 18:14:34 +02:00
|
|
|
//createModuloSchedulingPass - Creates the Swing Modulo Scheduling Pass
|
|
|
|
FunctionPass *createModuloSchedulingSBPass(TargetMachine & targ);
|
|
|
|
|
2003-11-11 23:41:34 +01:00
|
|
|
} // End llvm namespace
|
|
|
|
|
2003-01-13 02:01:31 +01:00
|
|
|
#endif
|