Local.h revision abbc2dd77908f146f73f4cd1abfdfe47faacf43d
148486893f46d2e12e926682a3ecb908716bc66c4Chris Lattner//===-- Local.h - Functions to perform local transformations ----*- C++ -*-===// 26fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// 36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// The LLVM Compiler Infrastructure 46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// 56fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// This file was developed by the LLVM research group and is distributed under 66fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details. 76fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// 86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//===----------------------------------------------------------------------===// 9148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner// 10148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner// This family of functions perform various local transformations to the 11148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner// program. 12148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner// 13148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner//===----------------------------------------------------------------------===// 14148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner 15148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner#ifndef LLVM_TRANSFORMS_UTILS_LOCAL_H 16148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner#define LLVM_TRANSFORMS_UTILS_LOCAL_H 17148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner 18148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner#include "llvm/Function.h" 19d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 20d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 21d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 223e57cb98bde04a65623493738d51f2a41e601748Chris Lattnerclass Pass; 23abbc2dd77908f146f73f4cd1abfdfe47faacf43dChris Lattnerclass PHINode; 24148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner 25148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner//===----------------------------------------------------------------------===// 2682c89b9f3a9b88bb63ce13b09b4f27fbb72f66fcMisha Brukman// Local constant propagation... 27148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner// 28148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner 2982c89b9f3a9b88bb63ce13b09b4f27fbb72f66fcMisha Brukman/// doConstantPropagation - Constant prop a specific instruction. Returns true 3082c89b9f3a9b88bb63ce13b09b4f27fbb72f66fcMisha Brukman/// and potentially moves the iterator if constant propagation was performed. 313e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// 3282c89b9f3a9b88bb63ce13b09b4f27fbb72f66fcMisha Brukmanbool doConstantPropagation(BasicBlock::iterator &I); 33148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner 343e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// ConstantFoldTerminator - If a terminator instruction is predicated on a 353e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// constant value, convert it into an unconditional branch to the constant 363e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// destination. This is a nontrivial operation because the successors of this 373e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// basic block must have their PHI nodes updated. 383e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// 3976ae3445f81164aaff9f95123426109c119f27c0Chris Lattnerbool ConstantFoldTerminator(BasicBlock *BB); 40148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner 41148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner 42148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner//===----------------------------------------------------------------------===// 43148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner// Local dead code elimination... 44148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner// 45148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner 463e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// isInstructionTriviallyDead - Return true if the result produced by the 473e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// instruction is not used, and the instruction has no side effects. 483e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// 49148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattnerbool isInstructionTriviallyDead(Instruction *I); 50148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner 51148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner 523e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// dceInstruction - Inspect the instruction at *BBI and figure out if it 533e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// isTriviallyDead. If so, remove the instruction and update the iterator to 543e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// point to the instruction that immediately succeeded the original 553e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// instruction. 563e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// 57a338016c7cba2c9cd9d6ecb4c57cedae22ff37e4Chris Lattnerbool dceInstruction(BasicBlock::iterator &BBI); 58148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner 59abbc2dd77908f146f73f4cd1abfdfe47faacf43dChris Lattner//===----------------------------------------------------------------------===// 60abbc2dd77908f146f73f4cd1abfdfe47faacf43dChris Lattner// PHI Instruction Simplification 61abbc2dd77908f146f73f4cd1abfdfe47faacf43dChris Lattner// 62abbc2dd77908f146f73f4cd1abfdfe47faacf43dChris Lattner 63abbc2dd77908f146f73f4cd1abfdfe47faacf43dChris Lattner/// hasConstantValue - If the specified PHI node always merges together the same 64abbc2dd77908f146f73f4cd1abfdfe47faacf43dChris Lattner/// value, return the value, otherwise return null. 65abbc2dd77908f146f73f4cd1abfdfe47faacf43dChris Lattner/// 66abbc2dd77908f146f73f4cd1abfdfe47faacf43dChris LattnerValue *hasConstantValue(PHINode *PN); 67abbc2dd77908f146f73f4cd1abfdfe47faacf43dChris Lattner 68148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner 69148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner//===----------------------------------------------------------------------===// 70148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner// Control Flow Graph Restructuring... 71148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner// 72148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner 733e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// SimplifyCFG - This function is used to do simplification of a CFG. For 743e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// example, it adjusts branches to branches to eliminate the extra hop, it 753e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// eliminates unreachable basic blocks, and does other "peephole" optimization 763e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// of the CFG. It returns true if a modification was made, possibly deleting 773e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// the basic block that was pointed to. 783e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// 793e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// WARNING: The entry node of a method may not be simplified. 803e57cb98bde04a65623493738d51f2a41e601748Chris Lattner/// 8118961504fc2b299578dba817900a0696cf3ccc4dChris Lattnerbool SimplifyCFG(BasicBlock *BB); 82148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner 83d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 84d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 85148a0bfcea5d3267eac02613cfcc8b5fe8894f2cChris Lattner#endif 86