Local.h revision 3e57cb98bde04a65623493738d51f2a41e601748
1148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner//===-- Local.h - Functions to perform local transformations -----*- C++ -*--=//
2148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner//
3148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner// This family of functions perform various local transformations to the
4148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner// program.
5148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner//
6148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner//===----------------------------------------------------------------------===//
7148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner
8148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner#ifndef LLVM_TRANSFORMS_UTILS_LOCAL_H
9148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner#define LLVM_TRANSFORMS_UTILS_LOCAL_H
10148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner
11148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner#include "llvm/Function.h"
123e57cb98bde04a65623493738d51f2a41e601748Chris Lattnerclass Pass;
13148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner
14148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner//===----------------------------------------------------------------------===//
15148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner//  Local constant propogation...
16148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner//
17148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner
183e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// doConstantPropogation - Constant prop a specific instruction.  Returns true
193e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// and potentially moves the iterator if constant propogation was performed.
203e57cb98bde04a65623493738d51f2a41e601748Chris Lattner///
21a338016c7cba2c9cd9d6ecb4c57cedae22ff37e4Chris Lattnerbool doConstantPropogation(BasicBlock::iterator &I);
22148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner
233e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// ConstantFoldTerminator - If a terminator instruction is predicated on a
243e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// constant value, convert it into an unconditional branch to the constant
253e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// destination.  This is a nontrivial operation because the successors of this
263e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// basic block must have their PHI nodes updated.
273e57cb98bde04a65623493738d51f2a41e601748Chris Lattner///
2876ae3445f81164aaff9f95123426109c119f27c0Chris Lattnerbool ConstantFoldTerminator(BasicBlock *BB);
29148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner
30148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner
31148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner//===----------------------------------------------------------------------===//
32148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner//  Local dead code elimination...
33148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner//
34148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner
353e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// isInstructionTriviallyDead - Return true if the result produced by the
363e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// instruction is not used, and the instruction has no side effects.
373e57cb98bde04a65623493738d51f2a41e601748Chris Lattner///
38148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattnerbool isInstructionTriviallyDead(Instruction *I);
39148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner
40148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner
413e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// dceInstruction - Inspect the instruction at *BBI and figure out if it
423e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// isTriviallyDead.  If so, remove the instruction and update the iterator to
433e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// point to the instruction that immediately succeeded the original
443e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// instruction.
453e57cb98bde04a65623493738d51f2a41e601748Chris Lattner///
46a338016c7cba2c9cd9d6ecb4c57cedae22ff37e4Chris Lattnerbool dceInstruction(BasicBlock::iterator &BBI);
47148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner
48148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner
49148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner//===----------------------------------------------------------------------===//
50148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner//  Control Flow Graph Restructuring...
51148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner//
52148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner
533e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// SimplifyCFG - This function is used to do simplification of a CFG.  For
543e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// example, it adjusts branches to branches to eliminate the extra hop, it
553e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// eliminates unreachable basic blocks, and does other "peephole" optimization
563e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// of the CFG.  It returns true if a modification was made, possibly deleting
573e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// the basic block that was pointed to.
583e57cb98bde04a65623493738d51f2a41e601748Chris Lattner///
593e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// WARNING:  The entry node of a method may not be simplified.
603e57cb98bde04a65623493738d51f2a41e601748Chris Lattner///
6118961504fc2b299578dba817900a0696cf3ccc4dChris Lattnerbool SimplifyCFG(BasicBlock *BB);
62148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner
633e57cb98bde04a65623493738d51f2a41e601748Chris Lattner
643e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// isCriticalEdge - Return true if the specified edge is a critical edge.
653e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// Critical edges are edges from a block with multiple successors to a block
663e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// with multiple predecessors.
673e57cb98bde04a65623493738d51f2a41e601748Chris Lattner///
683e57cb98bde04a65623493738d51f2a41e601748Chris Lattner///
693e57cb98bde04a65623493738d51f2a41e601748Chris Lattnerbool isCriticalEdge(const TerminatorInst *TI, unsigned SuccNum);
703e57cb98bde04a65623493738d51f2a41e601748Chris Lattner
713e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// BreakCriticalEdge - Insert a new node node to split the critical edge.  This
723e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// will update DominatorSet and DominatorTree information if it is available,
733e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// thus calling this pass will not invalidate either of them.
743e57cb98bde04a65623493738d51f2a41e601748Chris Lattner///
753e57cb98bde04a65623493738d51f2a41e601748Chris Lattnervoid BreakCriticalEdge(TerminatorInst *TI, unsigned SuccNum, Pass *P = 0);
763e57cb98bde04a65623493738d51f2a41e601748Chris Lattner
77148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner#endif
78