InstructionSimplify.h revision eff0581583ef10e2872e9baf537a04b67d992101
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// 109f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner// This file declares routines for folding instructions into simpler forms that 119f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner// do not require creating new instructions. For example, this does constant 129f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner// folding, and can handle identities like (X&0)->0. 139f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner// 149f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner//===----------------------------------------------------------------------===// 159f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner 169f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner#ifndef LLVM_ANALYSIS_INSTRUCTIONSIMPLIFY_H 179f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner#define LLVM_ANALYSIS_INSTRUCTIONSIMPLIFY_H 189f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner 199f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattnernamespace llvm { 20eff0581583ef10e2872e9baf537a04b67d992101Duncan Sands class DominatorTree; 21e34537856a544c83513e390ac9552a8bc3823346Chris Lattner class Instruction; 229f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner class Value; 239f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner class TargetData; 248aee8efc0c2e387faa7dae39fdf613a22889b566Chris Lattner 258aee8efc0c2e387faa7dae39fdf613a22889b566Chris Lattner /// SimplifyAddInst - Given operands for an Add, see if we can 268aee8efc0c2e387faa7dae39fdf613a22889b566Chris Lattner /// fold the result. If not, this returns null. 278aee8efc0c2e387faa7dae39fdf613a22889b566Chris Lattner Value *SimplifyAddInst(Value *LHS, Value *RHS, bool isNSW, bool isNUW, 288aee8efc0c2e387faa7dae39fdf613a22889b566Chris Lattner const TargetData *TD = 0); 2912a86f5b3199e72e6d967781acc76340f5920e46Duncan Sands 30d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner /// SimplifyAndInst - Given operands for an And, see if we can 31d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner /// fold the result. If not, this returns null. 32d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner Value *SimplifyAndInst(Value *LHS, Value *RHS, 33d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner const TargetData *TD = 0); 34d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner 35d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner /// SimplifyOrInst - Given operands for an Or, see if we can 36d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner /// fold the result. If not, this returns null. 37d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner Value *SimplifyOrInst(Value *LHS, Value *RHS, 38d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner const TargetData *TD = 0); 3912a86f5b3199e72e6d967781acc76340f5920e46Duncan Sands 409dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner /// SimplifyICmpInst - Given operands for an ICmpInst, see if we can 419f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner /// fold the result. If not, this returns null. 429dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS, 43d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner const TargetData *TD = 0); 4412a86f5b3199e72e6d967781acc76340f5920e46Duncan Sands 459dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner /// SimplifyFCmpInst - Given operands for an FCmpInst, see if we can 469dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner /// fold the result. If not, this returns null. 479dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner Value *SimplifyFCmpInst(unsigned Predicate, Value *LHS, Value *RHS, 48d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner const TargetData *TD = 0); 4912a86f5b3199e72e6d967781acc76340f5920e46Duncan Sands 50047542669a20505fc7c5f2d93caa5610aa3db2c5Chris Lattner /// SimplifySelectInst - Given operands for a SelectInst, see if we can fold 51047542669a20505fc7c5f2d93caa5610aa3db2c5Chris Lattner /// the result. If not, this returns null. 52047542669a20505fc7c5f2d93caa5610aa3db2c5Chris Lattner Value *SimplifySelectInst(Value *Cond, Value *TrueVal, Value *FalseVal, 53047542669a20505fc7c5f2d93caa5610aa3db2c5Chris Lattner const TargetData *TD = 0); 549dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner 55c514c1f5218b8fe7499a0b9a4737860344cf4c43Chris Lattner /// SimplifyGEPInst - Given operands for an GetElementPtrInst, see if we can 56c514c1f5218b8fe7499a0b9a4737860344cf4c43Chris Lattner /// fold the result. If not, this returns null. 57c514c1f5218b8fe7499a0b9a4737860344cf4c43Chris Lattner Value *SimplifyGEPInst(Value * const *Ops, unsigned NumOps, 58c514c1f5218b8fe7499a0b9a4737860344cf4c43Chris Lattner const TargetData *TD = 0); 5912a86f5b3199e72e6d967781acc76340f5920e46Duncan Sands 609dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner //=== Helper functions for higher up the class hierarchy. 6112a86f5b3199e72e6d967781acc76340f5920e46Duncan Sands 6212a86f5b3199e72e6d967781acc76340f5920e46Duncan Sands 639dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner /// SimplifyCmpInst - Given operands for a CmpInst, see if we can 649dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner /// fold the result. If not, this returns null. 659dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner Value *SimplifyCmpInst(unsigned Predicate, Value *LHS, Value *RHS, 669dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner const TargetData *TD = 0); 6712a86f5b3199e72e6d967781acc76340f5920e46Duncan Sands 689f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner /// SimplifyBinOp - Given operands for a BinaryOperator, see if we can 699f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner /// fold the result. If not, this returns null. 7012a86f5b3199e72e6d967781acc76340f5920e46Duncan Sands Value *SimplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS, 719f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner const TargetData *TD = 0); 7212a86f5b3199e72e6d967781acc76340f5920e46Duncan Sands 73e34537856a544c83513e390ac9552a8bc3823346Chris Lattner /// SimplifyInstruction - See if we can compute a simplified version of this 74e34537856a544c83513e390ac9552a8bc3823346Chris Lattner /// instruction. If not, this returns null. 754e282decf3960bfa6b1fe3fd77bb51ff96121515Owen Anderson /// WARNING: If called on unreachable code, an instruction may be reported 764e282decf3960bfa6b1fe3fd77bb51ff96121515Owen Anderson /// to simplify to itself. 77eff0581583ef10e2872e9baf537a04b67d992101Duncan Sands Value *SimplifyInstruction(Instruction *I, const TargetData *TD = 0, 78eff0581583ef10e2872e9baf537a04b67d992101Duncan Sands const DominatorTree *DT = 0); 7912a86f5b3199e72e6d967781acc76340f5920e46Duncan Sands 8012a86f5b3199e72e6d967781acc76340f5920e46Duncan Sands 8140d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner /// ReplaceAndSimplifyAllUses - Perform From->replaceAllUsesWith(To) and then 8240d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner /// delete the From instruction. In addition to a basic RAUW, this does a 8340d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner /// recursive simplification of the updated instructions. This catches 8440d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner /// things where one simplification exposes other opportunities. This only 8540d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner /// simplifies and deletes scalar operations, it does not change the CFG. 8640d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner /// 8740d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner void ReplaceAndSimplifyAllUses(Instruction *From, Value *To, 88eff0581583ef10e2872e9baf537a04b67d992101Duncan Sands const TargetData *TD = 0, 89eff0581583ef10e2872e9baf537a04b67d992101Duncan Sands const DominatorTree *DT = 0); 909f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner} // end namespace llvm 919f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner 929f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner#endif 939f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner 94