InstructionSimplify.h revision 40d8c28b27377199b7465ba2c5a2c59c6fd12fa9
1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch//===-- InstructionSimplify.h - Fold instructions into simpler forms ------===//
2effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch//
3effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch//                     The LLVM Compiler Infrastructure
4effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch//
5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// This file is distributed under the University of Illinois Open Source
6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// License. See LICENSE.TXT for details.
7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch//
8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch//===----------------------------------------------------------------------===//
9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch//
10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// This file declares routines for folding instructions into simpler forms that
11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// do not require creating new instructions.  For example, this does constant
12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// folding, and can handle identities like (X&0)->0.
13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch//
14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch//===----------------------------------------------------------------------===//
15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#ifndef LLVM_ANALYSIS_INSTRUCTIONSIMPLIFY_H
17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#define LLVM_ANALYSIS_INSTRUCTIONSIMPLIFY_H
18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace llvm {
20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  class Instruction;
21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  class Value;
22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  class TargetData;
23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  /// SimplifyAndInst - Given operands for an And, see if we can
25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  /// fold the result.  If not, this returns null.
26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Value *SimplifyAndInst(Value *LHS, Value *RHS,
27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                         const TargetData *TD = 0);
28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  /// SimplifyOrInst - Given operands for an Or, see if we can
30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  /// fold the result.  If not, this returns null.
31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Value *SimplifyOrInst(Value *LHS, Value *RHS,
32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                        const TargetData *TD = 0);
33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  /// SimplifyICmpInst - Given operands for an ICmpInst, see if we can
35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  /// fold the result.  If not, this returns null.
36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS,
37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                          const TargetData *TD = 0);
38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  /// SimplifyFCmpInst - Given operands for an FCmpInst, see if we can
40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  /// fold the result.  If not, this returns null.
41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Value *SimplifyFCmpInst(unsigned Predicate, Value *LHS, Value *RHS,
42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                          const TargetData *TD = 0);
43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
44effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  //=== Helper functions for higher up the class hierarchy.
46effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  /// SimplifyCmpInst - Given operands for a CmpInst, see if we can
49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  /// fold the result.  If not, this returns null.
50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Value *SimplifyCmpInst(unsigned Predicate, Value *LHS, Value *RHS,
51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                         const TargetData *TD = 0);
52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  /// SimplifyBinOp - Given operands for a BinaryOperator, see if we can
54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  /// fold the result.  If not, this returns null.
55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Value *SimplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS,
56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       const TargetData *TD = 0);
57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  /// SimplifyInstruction - See if we can compute a simplified version of this
59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  /// instruction.  If not, this returns null.
60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Value *SimplifyInstruction(Instruction *I, const TargetData *TD = 0);
61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  /// ReplaceAndSimplifyAllUses - Perform From->replaceAllUsesWith(To) and then
64  /// delete the From instruction.  In addition to a basic RAUW, this does a
65  /// recursive simplification of the updated instructions.  This catches
66  /// things where one simplification exposes other opportunities.  This only
67  /// simplifies and deletes scalar operations, it does not change the CFG.
68  ///
69  void ReplaceAndSimplifyAllUses(Instruction *From, Value *To,
70                                 const TargetData *TD = 0);
71} // end namespace llvm
72
73#endif
74
75