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