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