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