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