2003-08-21 22:14:26 +00:00
|
|
|
//===-- Passes.h - Target independent code generation passes ----*- C++ -*-===//
|
2005-04-21 20:39:54 +00:00
|
|
|
//
|
2003-10-20 20:19:47 +00:00
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
2007-12-29 19:59:42 +00:00
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
2005-04-21 20:39:54 +00:00
|
|
|
//
|
2003-10-20 20:19:47 +00:00
|
|
|
//===----------------------------------------------------------------------===//
|
2003-01-13 01:01:31 +00:00
|
|
|
//
|
2003-08-21 22:14:26 +00:00
|
|
|
// This file defines interfaces to access the target independent code generation
|
2003-01-13 01:01:31 +00:00
|
|
|
// passes provided by the LLVM backend.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#ifndef LLVM_CODEGEN_PASSES_H
|
|
|
|
#define LLVM_CODEGEN_PASSES_H
|
|
|
|
|
2009-10-16 21:06:15 +00:00
|
|
|
#include "llvm/Target/TargetMachine.h"
|
2004-02-04 21:41:10 +00:00
|
|
|
#include <string>
|
2004-01-30 21:53:46 +00:00
|
|
|
|
2003-11-11 22:41:34 +00:00
|
|
|
namespace llvm {
|
|
|
|
|
2003-12-20 10:18:58 +00:00
|
|
|
class FunctionPass;
|
2010-04-02 23:17:14 +00:00
|
|
|
class MachineFunctionPass;
|
2003-12-20 10:18:58 +00:00
|
|
|
class PassInfo;
|
2008-11-04 21:53:09 +00:00
|
|
|
class TargetLowering;
|
2007-09-06 16:18:45 +00:00
|
|
|
class RegisterCoalescer;
|
2009-08-23 03:13:20 +00:00
|
|
|
class raw_ostream;
|
2004-07-02 05:44:13 +00: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 20:39:54 +00:00
|
|
|
|
2003-12-20 10:18:58 +00:00
|
|
|
/// MachineFunctionPrinter pass - This pass prints out the machine function to
|
2009-08-03 01:02:24 +00:00
|
|
|
/// the given stream, as a debugging tool.
|
2010-04-02 23:17:14 +00:00
|
|
|
MachineFunctionPass *
|
|
|
|
createMachineFunctionPrinterPass(raw_ostream &OS,
|
|
|
|
const std::string &Banner ="");
|
2004-01-30 21:53:46 +00:00
|
|
|
|
2008-01-04 20:54:55 +00:00
|
|
|
/// MachineLoopInfo pass - This pass is a loop analysis pass.
|
|
|
|
///
|
2008-05-13 02:05:11 +00:00
|
|
|
extern const PassInfo *const MachineLoopInfoID;
|
2008-01-04 20:54:55 +00:00
|
|
|
|
|
|
|
/// MachineDominators pass - This pass is a machine dominators analysis pass.
|
|
|
|
///
|
2008-05-13 02:05:11 +00:00
|
|
|
extern const PassInfo *const MachineDominatorsID;
|
2008-01-04 20:54:55 +00:00
|
|
|
|
2003-12-20 10:18:58 +00: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);
|
|
|
|
///
|
2008-05-13 02:05:11 +00:00
|
|
|
extern const PassInfo *const PHIEliminationID;
|
2007-10-31 03:37:57 +00:00
|
|
|
|
|
|
|
/// 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
|
2008-05-13 02:05:11 +00:00
|
|
|
extern const PassInfo *const StrongPHIEliminationID;
|
2003-01-13 01:01:31 +00:00
|
|
|
|
2008-10-20 21:44:59 +00:00
|
|
|
extern const PassInfo *const PreAllocSplittingID;
|
|
|
|
|
2007-06-08 17:18:56 +00:00
|
|
|
/// SimpleRegisterCoalescing pass. Aggressively coalesces every register
|
|
|
|
/// copy it can.
|
|
|
|
///
|
2008-05-13 02:05:11 +00:00
|
|
|
extern const PassInfo *const SimpleRegisterCoalescingID;
|
2007-06-08 17:18:56 +00:00
|
|
|
|
2003-12-20 10:18:58 +00:00
|
|
|
/// TwoAddressInstruction pass - This pass reduces two-address instructions to
|
|
|
|
/// use two operands. This destroys SSA information but it is desired by
|
|
|
|
/// register allocators.
|
2008-05-13 02:05:11 +00:00
|
|
|
extern const PassInfo *const TwoAddressInstructionPassID;
|
2003-01-13 01:01:31 +00:00
|
|
|
|
2008-08-04 23:54:43 +00:00
|
|
|
/// UnreachableMachineBlockElimination pass - This pass removes unreachable
|
|
|
|
/// machine basic blocks.
|
|
|
|
extern const PassInfo *const UnreachableMachineBlockElimID;
|
|
|
|
|
2008-09-17 00:43:24 +00:00
|
|
|
/// DeadMachineInstructionElim pass - This pass removes dead machine
|
|
|
|
/// instructions.
|
|
|
|
///
|
|
|
|
FunctionPass *createDeadMachineInstructionElimPass();
|
|
|
|
|
2010-05-27 23:57:25 +00:00
|
|
|
/// Creates a register allocator as the user specified on the command line, or
|
|
|
|
/// picks one that matches OptLevel.
|
2003-12-20 10:18:58 +00:00
|
|
|
///
|
2010-05-27 23:57:25 +00:00
|
|
|
FunctionPass *createRegisterAllocator(CodeGenOpt::Level OptLevel);
|
2003-01-13 01:01:31 +00:00
|
|
|
|
2010-04-21 18:02:42 +00:00
|
|
|
/// FastRegisterAllocation Pass - This pass register allocates as fast as
|
|
|
|
/// possible. It is best suited for debug code where live ranges are short.
|
|
|
|
///
|
|
|
|
FunctionPass *createFastRegisterAllocator();
|
|
|
|
|
2003-12-20 10:18:58 +00:00
|
|
|
/// LinearScanRegisterAllocation Pass - This pass implements the linear scan
|
|
|
|
/// register allocation algorithm, a global register allocator.
|
|
|
|
///
|
|
|
|
FunctionPass *createLinearScanRegisterAllocator();
|
2008-10-02 18:29:27 +00:00
|
|
|
|
|
|
|
/// PBQPRegisterAllocation Pass - This pass implements the Partitioned Boolean
|
|
|
|
/// Quadratic Prograaming (PBQP) based register allocator.
|
|
|
|
///
|
|
|
|
FunctionPass *createPBQPRegisterAllocator();
|
2003-01-13 01:01:31 +00:00
|
|
|
|
2007-09-06 16:18:45 +00:00
|
|
|
/// SimpleRegisterCoalescing Pass - Coalesce all copies possible. Can run
|
|
|
|
/// independently of the register allocator.
|
|
|
|
///
|
|
|
|
RegisterCoalescer *createSimpleRegisterCoalescer();
|
|
|
|
|
2003-12-20 10:18:58 +00:00
|
|
|
/// PrologEpilogCodeInserter Pass - This pass inserts prolog and epilog code,
|
|
|
|
/// and eliminates abstract frame references.
|
|
|
|
///
|
|
|
|
FunctionPass *createPrologEpilogCodeInserter();
|
2007-07-26 08:18:32 +00:00
|
|
|
|
|
|
|
/// LowerSubregs Pass - This pass lowers subregs to register-register copies
|
2007-08-06 16:33:56 +00:00
|
|
|
/// which yields suboptimal, but correct code if the register allocator
|
2007-07-26 08:18:32 +00:00
|
|
|
/// cannot coalesce all subreg operations during allocation.
|
|
|
|
///
|
|
|
|
FunctionPass *createLowerSubregsPass();
|
2003-09-30 20:14:43 +00:00
|
|
|
|
2009-10-16 21:06:15 +00:00
|
|
|
/// createPostRAScheduler - This pass performs post register allocation
|
|
|
|
/// scheduling.
|
|
|
|
FunctionPass *createPostRAScheduler(CodeGenOpt::Level OptLevel);
|
2007-07-13 17:13:54 +00:00
|
|
|
|
2004-07-31 09:59:14 +00: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.
|
2009-10-28 20:46:46 +00:00
|
|
|
FunctionPass *createBranchFoldingPass(bool DefaultEnableTailMerge);
|
2004-07-31 09:59:14 +00:00
|
|
|
|
2009-11-26 21:38:41 +00:00
|
|
|
/// TailDuplicate Pass - Duplicate blocks with unconditional branches
|
2009-11-26 00:32:21 +00:00
|
|
|
/// into tails of their predecessors.
|
2009-12-04 09:42:45 +00:00
|
|
|
FunctionPass *createTailDuplicatePass(bool PreRegAlloc = false);
|
2009-11-26 00:32:21 +00:00
|
|
|
|
2009-10-28 20:46:46 +00:00
|
|
|
/// IfConverter Pass - This pass performs machine code if conversion.
|
|
|
|
FunctionPass *createIfConverterPass();
|
2007-05-16 02:00:57 +00:00
|
|
|
|
2009-05-07 05:42:24 +00:00
|
|
|
/// Code Placement Pass - This pass optimize code placement and aligns loop
|
|
|
|
/// headers to target specific alignment boundary.
|
|
|
|
FunctionPass *createCodePlacementOptPass();
|
2008-02-28 00:43:03 +00:00
|
|
|
|
2007-12-11 00:30:17 +00:00
|
|
|
/// IntrinsicLowering Pass - Performs target-independent LLVM IR
|
2008-08-17 18:44:35 +00:00
|
|
|
/// transformations for highly portable strategies.
|
2007-12-11 00:30:17 +00:00
|
|
|
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();
|
|
|
|
|
2008-08-17 18:44:35 +00:00
|
|
|
/// Deleter Pass - Releases GC metadata.
|
2007-12-11 00:30:17 +00:00
|
|
|
///
|
2008-08-17 18:44:35 +00:00
|
|
|
FunctionPass *createGCInfoDeleter();
|
2007-12-11 00:30:17 +00:00
|
|
|
|
2008-08-17 18:44:35 +00:00
|
|
|
/// Creates a pass to print GC metadata.
|
2007-12-11 00:30:17 +00:00
|
|
|
///
|
2009-08-23 03:13:20 +00:00
|
|
|
FunctionPass *createGCInfoPrinter(raw_ostream &OS);
|
2007-12-11 00:30:17 +00:00
|
|
|
|
2010-03-02 02:38:24 +00:00
|
|
|
/// createMachineCSEPass - This pass performs global CSE on machine
|
|
|
|
/// instructions.
|
|
|
|
FunctionPass *createMachineCSEPass();
|
|
|
|
|
Initial commit of the machine code LICM pass. It successfully hoists this:
_foo:
li r2, 0
LBB1_1: ; bb
li r5, 0
stw r5, 0(r3)
addi r2, r2, 1
addi r3, r3, 4
cmplw cr0, r2, r4
bne cr0, LBB1_1 ; bb
LBB1_2: ; return
blr
to:
_foo:
li r2, 0
li r5, 0
LBB1_1: ; bb
stw r5, 0(r3)
addi r2, r2, 1
addi r3, r3, 4
cmplw cr0, r2, r4
bne cr0, LBB1_1 ; bb
LBB1_2: ; return
blr
ZOMG!! :-)
Moar to come...
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44687 91177308-0d34-0410-b5e6-96231b3b80d8
2007-12-07 21:42:31 +00:00
|
|
|
/// createMachineLICMPass - This pass performs LICM on machine instructions.
|
|
|
|
///
|
2010-04-07 00:41:17 +00:00
|
|
|
FunctionPass *createMachineLICMPass(bool PreRegAlloc = true);
|
Initial commit of the machine code LICM pass. It successfully hoists this:
_foo:
li r2, 0
LBB1_1: ; bb
li r5, 0
stw r5, 0(r3)
addi r2, r2, 1
addi r3, r3, 4
cmplw cr0, r2, r4
bne cr0, LBB1_1 ; bb
LBB1_2: ; return
blr
to:
_foo:
li r2, 0
li r5, 0
LBB1_1: ; bb
stw r5, 0(r3)
addi r2, r2, 1
addi r3, r3, 4
cmplw cr0, r2, r4
bne cr0, LBB1_1 ; bb
LBB1_2: ; return
blr
ZOMG!! :-)
Moar to come...
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44687 91177308-0d34-0410-b5e6-96231b3b80d8
2007-12-07 21:42:31 +00:00
|
|
|
|
Add a really quick hack at a machine code sinking pass, enabled with --enable-sinking.
It is missing validity checks, so it is known broken. However, it is powerful enough
to compile this contrived code:
void test1(int C, double A, double B, double *P) {
double Tmp = A*A+B*B;
*P = C ? Tmp : A;
}
into:
_test1:
movsd 8(%esp), %xmm0
cmpl $0, 4(%esp)
je LBB1_2 # entry
LBB1_1: # entry
movsd 16(%esp), %xmm1
mulsd %xmm1, %xmm1
mulsd %xmm0, %xmm0
addsd %xmm1, %xmm0
LBB1_2: # entry
movl 24(%esp), %eax
movsd %xmm0, (%eax)
ret
instead of:
_test1:
movsd 16(%esp), %xmm0
mulsd %xmm0, %xmm0
movsd 8(%esp), %xmm1
movapd %xmm1, %xmm2
mulsd %xmm2, %xmm2
addsd %xmm0, %xmm2
cmpl $0, 4(%esp)
je LBB1_2 # entry
LBB1_1: # entry
movapd %xmm2, %xmm1
LBB1_2: # entry
movl 24(%esp), %eax
movsd %xmm1, (%eax)
ret
woo.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45570 91177308-0d34-0410-b5e6-96231b3b80d8
2008-01-04 07:36:53 +00:00
|
|
|
/// createMachineSinkingPass - This pass performs sinking on machine
|
|
|
|
/// instructions.
|
|
|
|
FunctionPass *createMachineSinkingPass();
|
2008-06-04 09:18:41 +00:00
|
|
|
|
2010-01-13 00:30:23 +00:00
|
|
|
/// createOptimizeExtsPass - This pass performs sign / zero extension
|
|
|
|
/// optimization by increasing uses of extended values.
|
|
|
|
FunctionPass *createOptimizeExtsPass();
|
|
|
|
|
2010-02-12 01:30:21 +00:00
|
|
|
/// createOptimizePHIsPass - This pass optimizes machine instruction PHIs
|
|
|
|
/// to take advantage of opportunities created during DAG legalization.
|
|
|
|
FunctionPass *createOptimizePHIsPass();
|
|
|
|
|
2008-06-04 09:18:41 +00:00
|
|
|
/// createStackSlotColoringPass - This pass performs stack slot coloring.
|
2009-05-07 01:33:38 +00:00
|
|
|
FunctionPass *createStackSlotColoringPass(bool);
|
2008-11-04 02:10:20 +00:00
|
|
|
|
|
|
|
/// createStackProtectorPass - This pass adds stack protectors to functions.
|
2008-11-13 01:02:14 +00:00
|
|
|
FunctionPass *createStackProtectorPass(const TargetLowering *tli);
|
2008-11-04 02:10:20 +00:00
|
|
|
|
2009-05-16 00:33:53 +00:00
|
|
|
/// createMachineVerifierPass - This pass verifies cenerated machine code
|
|
|
|
/// instructions for correctness.
|
|
|
|
///
|
2010-02-22 04:10:52 +00:00
|
|
|
/// @param allowDoubleDefs ignore double definitions of
|
2009-05-16 00:33:53 +00:00
|
|
|
/// registers. Useful before LiveVariables has run.
|
|
|
|
FunctionPass *createMachineVerifierPass(bool allowDoubleDefs);
|
|
|
|
|
2009-05-22 20:36:31 +00:00
|
|
|
/// createDwarfEHPass - This pass mulches exception handling code into a form
|
|
|
|
/// adapted to code generation. Required if using dwarf exception handling.
|
2010-04-19 19:05:59 +00:00
|
|
|
FunctionPass *createDwarfEHPass(const TargetMachine *tm, bool fast);
|
2009-05-22 20:36:31 +00:00
|
|
|
|
2009-08-17 16:41:22 +00:00
|
|
|
/// 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);
|
|
|
|
|
2003-11-11 22:41:34 +00:00
|
|
|
} // End llvm namespace
|
|
|
|
|
2003-01-13 01:01:31 +00:00
|
|
|
#endif
|