19f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner//===-- InstructionSimplify.h - Fold instructions into simpler forms ------===//
29f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner//
39f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner//                     The LLVM Compiler Infrastructure
49f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner//
59f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner// This file is distributed under the University of Illinois Open Source
69f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner// License. See LICENSE.TXT for details.
79f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner//
89f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner//===----------------------------------------------------------------------===//
99f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner//
104cd2ad15b43f21d641330b4b09961af08646445eDuncan Sands// This file declares routines for folding instructions into simpler forms
114cd2ad15b43f21d641330b4b09961af08646445eDuncan Sands// that do not require creating new instructions.  This does constant folding
124cd2ad15b43f21d641330b4b09961af08646445eDuncan Sands// ("add i32 1, 1" -> "2") but can also handle non-constant operands, either
134cd2ad15b43f21d641330b4b09961af08646445eDuncan Sands// returning a constant ("and i32 %x, 0" -> "0") or an already existing value
1419f14dcf6af11b5520acfc5c2fd4100ec1972b44Duncan Sands// ("and i32 %x, %x" -> "%x").  If the simplification is also an instruction
1519f14dcf6af11b5520acfc5c2fd4100ec1972b44Duncan Sands// then it dominates the original instruction.
169f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner//
179f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner//===----------------------------------------------------------------------===//
189f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner
199f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner#ifndef LLVM_ANALYSIS_INSTRUCTIONSIMPLIFY_H
209f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner#define LLVM_ANALYSIS_INSTRUCTIONSIMPLIFY_H
219f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner
229f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattnernamespace llvm {
23bd0fe5642544d4ec3aee1ede7af60c006bae5cbfDuncan Sands  template<typename T>
24bd0fe5642544d4ec3aee1ede7af60c006bae5cbfDuncan Sands  class ArrayRef;
25eff0581583ef10e2872e9baf537a04b67d992101Duncan Sands  class DominatorTree;
26e34537856a544c83513e390ac9552a8bc3823346Chris Lattner  class Instruction;
279f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner  class TargetData;
28618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier  class TargetLibraryInfo;
29bd0fe5642544d4ec3aee1ede7af60c006bae5cbfDuncan Sands  class Type;
30bd0fe5642544d4ec3aee1ede7af60c006bae5cbfDuncan Sands  class Value;
318aee8efc0c2e387faa7dae39fdf613a22889b566Chris Lattner
328aee8efc0c2e387faa7dae39fdf613a22889b566Chris Lattner  /// SimplifyAddInst - Given operands for an Add, see if we can
338aee8efc0c2e387faa7dae39fdf613a22889b566Chris Lattner  /// fold the result.  If not, this returns null.
348aee8efc0c2e387faa7dae39fdf613a22889b566Chris Lattner  Value *SimplifyAddInst(Value *LHS, Value *RHS, bool isNSW, bool isNUW,
35618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                         const TargetData *TD = 0,
36618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                         const TargetLibraryInfo *TLI = 0,
37618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                         const DominatorTree *DT = 0);
3812a86f5b3199e72e6d967781acc76340f5920e46Duncan Sands
39fea3b218d61708ea3577f4ef14c8f7677a94db95Duncan Sands  /// SimplifySubInst - Given operands for a Sub, see if we can
40fea3b218d61708ea3577f4ef14c8f7677a94db95Duncan Sands  /// fold the result.  If not, this returns null.
41fea3b218d61708ea3577f4ef14c8f7677a94db95Duncan Sands  Value *SimplifySubInst(Value *LHS, Value *RHS, bool isNSW, bool isNUW,
42618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                         const TargetData *TD = 0,
43618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                         const TargetLibraryInfo *TLI = 0,
44618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                         const DominatorTree *DT = 0);
45fea3b218d61708ea3577f4ef14c8f7677a94db95Duncan Sands
46c43cee3fbb3098f0647e50dd2c13bc55b027a228Duncan Sands  /// SimplifyMulInst - Given operands for a Mul, see if we can
47d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner  /// fold the result.  If not, this returns null.
48c43cee3fbb3098f0647e50dd2c13bc55b027a228Duncan Sands  Value *SimplifyMulInst(Value *LHS, Value *RHS, const TargetData *TD = 0,
49618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                         const TargetLibraryInfo *TLI = 0,
501845009290e4d804ad377927bd8a08cca3036adcDuncan Sands                         const DominatorTree *DT = 0);
51d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner
52593faa53fa6d89841e601cc4571d143a6a05f0b4Duncan Sands  /// SimplifySDivInst - Given operands for an SDiv, see if we can
53593faa53fa6d89841e601cc4571d143a6a05f0b4Duncan Sands  /// fold the result.  If not, this returns null.
54593faa53fa6d89841e601cc4571d143a6a05f0b4Duncan Sands  Value *SimplifySDivInst(Value *LHS, Value *RHS, const TargetData *TD = 0,
55618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                          const TargetLibraryInfo *TLI = 0,
56593faa53fa6d89841e601cc4571d143a6a05f0b4Duncan Sands                          const DominatorTree *DT = 0);
57593faa53fa6d89841e601cc4571d143a6a05f0b4Duncan Sands
58593faa53fa6d89841e601cc4571d143a6a05f0b4Duncan Sands  /// SimplifyUDivInst - Given operands for a UDiv, see if we can
59593faa53fa6d89841e601cc4571d143a6a05f0b4Duncan Sands  /// fold the result.  If not, this returns null.
60618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier  Value *SimplifyUDivInst(Value *LHS, Value *RHS, const TargetData *TD = 0,
61618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                          const TargetLibraryInfo *TLI = 0,
621fca2c32cc99197215d3fd32a4ad05214c74edd1Frits van Bommel                          const DominatorTree *DT = 0);
631fca2c32cc99197215d3fd32a4ad05214c74edd1Frits van Bommel
641fca2c32cc99197215d3fd32a4ad05214c74edd1Frits van Bommel  /// SimplifyFDivInst - Given operands for an FDiv, see if we can
651fca2c32cc99197215d3fd32a4ad05214c74edd1Frits van Bommel  /// fold the result.  If not, this returns null.
661fca2c32cc99197215d3fd32a4ad05214c74edd1Frits van Bommel  Value *SimplifyFDivInst(Value *LHS, Value *RHS, const TargetData *TD = 0,
67618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                          const TargetLibraryInfo *TLI = 0,
681fca2c32cc99197215d3fd32a4ad05214c74edd1Frits van Bommel                          const DominatorTree *DT = 0);
69593faa53fa6d89841e601cc4571d143a6a05f0b4Duncan Sands
70194cfb08ffe5d1c6f457b8fd1d688540a29dfc75Duncan Sands  /// SimplifySRemInst - Given operands for an SRem, see if we can
71194cfb08ffe5d1c6f457b8fd1d688540a29dfc75Duncan Sands  /// fold the result.  If not, this returns null.
72618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier  Value *SimplifySRemInst(Value *LHS, Value *RHS, const TargetData *TD = 0,
73618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                          const TargetLibraryInfo *TLI = 0,
74194cfb08ffe5d1c6f457b8fd1d688540a29dfc75Duncan Sands                          const DominatorTree *DT = 0);
75194cfb08ffe5d1c6f457b8fd1d688540a29dfc75Duncan Sands
76194cfb08ffe5d1c6f457b8fd1d688540a29dfc75Duncan Sands  /// SimplifyURemInst - Given operands for a URem, see if we can
77194cfb08ffe5d1c6f457b8fd1d688540a29dfc75Duncan Sands  /// fold the result.  If not, this returns null.
78194cfb08ffe5d1c6f457b8fd1d688540a29dfc75Duncan Sands  Value *SimplifyURemInst(Value *LHS, Value *RHS, const TargetData *TD = 0,
79618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                          const TargetLibraryInfo *TLI = 0,
80194cfb08ffe5d1c6f457b8fd1d688540a29dfc75Duncan Sands                          const DominatorTree *DT = 0);
81194cfb08ffe5d1c6f457b8fd1d688540a29dfc75Duncan Sands
82194cfb08ffe5d1c6f457b8fd1d688540a29dfc75Duncan Sands  /// SimplifyFRemInst - Given operands for an FRem, see if we can
83194cfb08ffe5d1c6f457b8fd1d688540a29dfc75Duncan Sands  /// fold the result.  If not, this returns null.
84194cfb08ffe5d1c6f457b8fd1d688540a29dfc75Duncan Sands  Value *SimplifyFRemInst(Value *LHS, Value *RHS, const TargetData *TD = 0,
85618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                          const TargetLibraryInfo *TLI = 0,
86194cfb08ffe5d1c6f457b8fd1d688540a29dfc75Duncan Sands                          const DominatorTree *DT = 0);
87194cfb08ffe5d1c6f457b8fd1d688540a29dfc75Duncan Sands
88c43cee3fbb3098f0647e50dd2c13bc55b027a228Duncan Sands  /// SimplifyShlInst - Given operands for a Shl, see if we can
8982fdab335881cd90f8f7ab3ad1f1ca0bb3ee886aDuncan Sands  /// fold the result.  If not, this returns null.
9081a0dc911586c77421c2255aa417dc9b350b9e20Chris Lattner  Value *SimplifyShlInst(Value *Op0, Value *Op1, bool isNSW, bool isNUW,
91618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                         const TargetData *TD = 0,
92618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                         const TargetLibraryInfo *TLI = 0,
93618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                         const DominatorTree *DT = 0);
94c43cee3fbb3098f0647e50dd2c13bc55b027a228Duncan Sands
95c43cee3fbb3098f0647e50dd2c13bc55b027a228Duncan Sands  /// SimplifyLShrInst - Given operands for a LShr, see if we can
96c43cee3fbb3098f0647e50dd2c13bc55b027a228Duncan Sands  /// fold the result.  If not, this returns null.
9781a0dc911586c77421c2255aa417dc9b350b9e20Chris Lattner  Value *SimplifyLShrInst(Value *Op0, Value *Op1, bool isExact,
98618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                          const TargetData *TD = 0,
99618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                          const TargetLibraryInfo *TLI = 0,
100618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                          const DominatorTree *DT = 0);
101c43cee3fbb3098f0647e50dd2c13bc55b027a228Duncan Sands
102c43cee3fbb3098f0647e50dd2c13bc55b027a228Duncan Sands  /// SimplifyAShrInst - Given operands for a AShr, see if we can
103c43cee3fbb3098f0647e50dd2c13bc55b027a228Duncan Sands  /// fold the result.  If not, this returns null.
10481a0dc911586c77421c2255aa417dc9b350b9e20Chris Lattner  Value *SimplifyAShrInst(Value *Op0, Value *Op1, bool isExact,
10581a0dc911586c77421c2255aa417dc9b350b9e20Chris Lattner                          const TargetData *TD = 0,
106618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                          const TargetLibraryInfo *TLI = 0,
107c43cee3fbb3098f0647e50dd2c13bc55b027a228Duncan Sands                          const DominatorTree *DT = 0);
108c43cee3fbb3098f0647e50dd2c13bc55b027a228Duncan Sands
109c43cee3fbb3098f0647e50dd2c13bc55b027a228Duncan Sands  /// SimplifyAndInst - Given operands for an And, see if we can
110c43cee3fbb3098f0647e50dd2c13bc55b027a228Duncan Sands  /// fold the result.  If not, this returns null.
111c43cee3fbb3098f0647e50dd2c13bc55b027a228Duncan Sands  Value *SimplifyAndInst(Value *LHS, Value *RHS, const TargetData *TD = 0,
112618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                         const TargetLibraryInfo *TLI = 0,
11382fdab335881cd90f8f7ab3ad1f1ca0bb3ee886aDuncan Sands                         const DominatorTree *DT = 0);
11482fdab335881cd90f8f7ab3ad1f1ca0bb3ee886aDuncan Sands
115d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner  /// SimplifyOrInst - Given operands for an Or, see if we can
116d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner  /// fold the result.  If not, this returns null.
1171845009290e4d804ad377927bd8a08cca3036adcDuncan Sands  Value *SimplifyOrInst(Value *LHS, Value *RHS, const TargetData *TD = 0,
118618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                        const TargetLibraryInfo *TLI = 0,
1191845009290e4d804ad377927bd8a08cca3036adcDuncan Sands                        const DominatorTree *DT = 0);
12012a86f5b3199e72e6d967781acc76340f5920e46Duncan Sands
1212b749870d0488c3b049edf5d0c8875f56f5b1bedDuncan Sands  /// SimplifyXorInst - Given operands for a Xor, see if we can
1222b749870d0488c3b049edf5d0c8875f56f5b1bedDuncan Sands  /// fold the result.  If not, this returns null.
1232b749870d0488c3b049edf5d0c8875f56f5b1bedDuncan Sands  Value *SimplifyXorInst(Value *LHS, Value *RHS, const TargetData *TD = 0,
124618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                         const TargetLibraryInfo *TLI = 0,
1252b749870d0488c3b049edf5d0c8875f56f5b1bedDuncan Sands                         const DominatorTree *DT = 0);
1262b749870d0488c3b049edf5d0c8875f56f5b1bedDuncan Sands
1279dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner  /// SimplifyICmpInst - Given operands for an ICmpInst, see if we can
1289f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner  /// fold the result.  If not, this returns null.
1299dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner  Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS,
130618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                          const TargetData *TD = 0,
131618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                          const TargetLibraryInfo *TLI = 0,
1321845009290e4d804ad377927bd8a08cca3036adcDuncan Sands                          const DominatorTree *DT = 0);
13312a86f5b3199e72e6d967781acc76340f5920e46Duncan Sands
1349dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner  /// SimplifyFCmpInst - Given operands for an FCmpInst, see if we can
1359dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner  /// fold the result.  If not, this returns null.
1369dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner  Value *SimplifyFCmpInst(unsigned Predicate, Value *LHS, Value *RHS,
137618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                          const TargetData *TD = 0,
138618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                          const TargetLibraryInfo *TLI = 0,
1391845009290e4d804ad377927bd8a08cca3036adcDuncan Sands                          const DominatorTree *DT = 0);
14012a86f5b3199e72e6d967781acc76340f5920e46Duncan Sands
141047542669a20505fc7c5f2d93caa5610aa3db2c5Chris Lattner  /// SimplifySelectInst - Given operands for a SelectInst, see if we can fold
142047542669a20505fc7c5f2d93caa5610aa3db2c5Chris Lattner  /// the result.  If not, this returns null.
143047542669a20505fc7c5f2d93caa5610aa3db2c5Chris Lattner  Value *SimplifySelectInst(Value *Cond, Value *TrueVal, Value *FalseVal,
1441845009290e4d804ad377927bd8a08cca3036adcDuncan Sands                            const TargetData *TD = 0,
1450aa85eb231dc76bcabcd35f6dc9a50536f607df3Duncan Sands                            const TargetLibraryInfo *TLI = 0,
1461845009290e4d804ad377927bd8a08cca3036adcDuncan Sands                            const DominatorTree *DT = 0);
1479dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner
148c514c1f5218b8fe7499a0b9a4737860344cf4c43Chris Lattner  /// SimplifyGEPInst - Given operands for an GetElementPtrInst, see if we can
149c514c1f5218b8fe7499a0b9a4737860344cf4c43Chris Lattner  /// fold the result.  If not, this returns null.
150618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier  Value *SimplifyGEPInst(ArrayRef<Value *> Ops, const TargetData *TD = 0,
1510aa85eb231dc76bcabcd35f6dc9a50536f607df3Duncan Sands                         const TargetLibraryInfo *TLI = 0,
152618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                         const DominatorTree *DT = 0);
15312a86f5b3199e72e6d967781acc76340f5920e46Duncan Sands
154dabc2806726a286b00313419fac8461ebe0f774cDuncan Sands  /// SimplifyInsertValueInst - Given operands for an InsertValueInst, see if we
155dabc2806726a286b00313419fac8461ebe0f774cDuncan Sands  /// can fold the result.  If not, this returns null.
156dabc2806726a286b00313419fac8461ebe0f774cDuncan Sands  Value *SimplifyInsertValueInst(Value *Agg, Value *Val,
157dabc2806726a286b00313419fac8461ebe0f774cDuncan Sands                                 ArrayRef<unsigned> Idxs,
158dabc2806726a286b00313419fac8461ebe0f774cDuncan Sands                                 const TargetData *TD = 0,
1590aa85eb231dc76bcabcd35f6dc9a50536f607df3Duncan Sands                                 const TargetLibraryInfo *TLI = 0,
160dabc2806726a286b00313419fac8461ebe0f774cDuncan Sands                                 const DominatorTree *DT = 0);
161dabc2806726a286b00313419fac8461ebe0f774cDuncan Sands
162bd0fe5642544d4ec3aee1ede7af60c006bae5cbfDuncan Sands  /// SimplifyTruncInst - Given operands for an TruncInst, see if we can fold
163bd0fe5642544d4ec3aee1ede7af60c006bae5cbfDuncan Sands  /// the result.  If not, this returns null.
164bd0fe5642544d4ec3aee1ede7af60c006bae5cbfDuncan Sands  Value *SimplifyTruncInst(Value *Op, Type *Ty, const TargetData *TD = 0,
165bd0fe5642544d4ec3aee1ede7af60c006bae5cbfDuncan Sands                           const TargetLibraryInfo *TLI = 0,
166bd0fe5642544d4ec3aee1ede7af60c006bae5cbfDuncan Sands                           const DominatorTree *DT = 0);
167bd0fe5642544d4ec3aee1ede7af60c006bae5cbfDuncan Sands
1689dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner  //=== Helper functions for higher up the class hierarchy.
16912a86f5b3199e72e6d967781acc76340f5920e46Duncan Sands
17012a86f5b3199e72e6d967781acc76340f5920e46Duncan Sands
1719dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner  /// SimplifyCmpInst - Given operands for a CmpInst, see if we can
1729dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner  /// fold the result.  If not, this returns null.
1739dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner  Value *SimplifyCmpInst(unsigned Predicate, Value *LHS, Value *RHS,
174618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                         const TargetData *TD = 0,
175618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                         const TargetLibraryInfo *TLI = 0,
176618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                         const DominatorTree *DT = 0);
17712a86f5b3199e72e6d967781acc76340f5920e46Duncan Sands
1789f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner  /// SimplifyBinOp - Given operands for a BinaryOperator, see if we can
1799f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner  /// fold the result.  If not, this returns null.
18012a86f5b3199e72e6d967781acc76340f5920e46Duncan Sands  Value *SimplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS,
181618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                       const TargetData *TD = 0,
182618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                       const TargetLibraryInfo *TLI = 0,
183618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                       const DominatorTree *DT = 0);
18412a86f5b3199e72e6d967781acc76340f5920e46Duncan Sands
185e34537856a544c83513e390ac9552a8bc3823346Chris Lattner  /// SimplifyInstruction - See if we can compute a simplified version of this
186e34537856a544c83513e390ac9552a8bc3823346Chris Lattner  /// instruction.  If not, this returns null.
187eff0581583ef10e2872e9baf537a04b67d992101Duncan Sands  Value *SimplifyInstruction(Instruction *I, const TargetData *TD = 0,
188618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                             const TargetLibraryInfo *TLI = 0,
189eff0581583ef10e2872e9baf537a04b67d992101Duncan Sands                             const DominatorTree *DT = 0);
19012a86f5b3199e72e6d967781acc76340f5920e46Duncan Sands
19112a86f5b3199e72e6d967781acc76340f5920e46Duncan Sands
1926b980541df5846ad335c377c8803b517968daee2Chandler Carruth  /// \brief Replace all uses of 'I' with 'SimpleV' and simplify the uses
1936b980541df5846ad335c377c8803b517968daee2Chandler Carruth  /// recursively.
19440d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner  ///
1956b980541df5846ad335c377c8803b517968daee2Chandler Carruth  /// This first performs a normal RAUW of I with SimpleV. It then recursively
1966b980541df5846ad335c377c8803b517968daee2Chandler Carruth  /// attempts to simplify those users updated by the operation. The 'I'
1976b980541df5846ad335c377c8803b517968daee2Chandler Carruth  /// instruction must not be equal to the simplified value 'SimpleV'.
1986b980541df5846ad335c377c8803b517968daee2Chandler Carruth  ///
1996b980541df5846ad335c377c8803b517968daee2Chandler Carruth  /// The function returns true if any simplifications were performed.
2006b980541df5846ad335c377c8803b517968daee2Chandler Carruth  bool replaceAndRecursivelySimplify(Instruction *I, Value *SimpleV,
2016b980541df5846ad335c377c8803b517968daee2Chandler Carruth                                     const TargetData *TD = 0,
2026b980541df5846ad335c377c8803b517968daee2Chandler Carruth                                     const TargetLibraryInfo *TLI = 0,
2036b980541df5846ad335c377c8803b517968daee2Chandler Carruth                                     const DominatorTree *DT = 0);
2046b980541df5846ad335c377c8803b517968daee2Chandler Carruth
2056b980541df5846ad335c377c8803b517968daee2Chandler Carruth  /// \brief Recursively attempt to simplify an instruction.
2066b980541df5846ad335c377c8803b517968daee2Chandler Carruth  ///
2076b980541df5846ad335c377c8803b517968daee2Chandler Carruth  /// This routine uses SimplifyInstruction to simplify 'I', and if successful
2086b980541df5846ad335c377c8803b517968daee2Chandler Carruth  /// replaces uses of 'I' with the simplified value. It then recurses on each
2096b980541df5846ad335c377c8803b517968daee2Chandler Carruth  /// of the users impacted. It returns true if any simplifications were
2106b980541df5846ad335c377c8803b517968daee2Chandler Carruth  /// performed.
2116b980541df5846ad335c377c8803b517968daee2Chandler Carruth  bool recursivelySimplifyInstruction(Instruction *I,
2126b980541df5846ad335c377c8803b517968daee2Chandler Carruth                                      const TargetData *TD = 0,
2136b980541df5846ad335c377c8803b517968daee2Chandler Carruth                                      const TargetLibraryInfo *TLI = 0,
2146b980541df5846ad335c377c8803b517968daee2Chandler Carruth                                      const DominatorTree *DT = 0);
2159f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner} // end namespace llvm
2169f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner
2179f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner#endif
2189f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner
219