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