mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +00:00 
			
		
		
		
	git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@130695 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			159 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //===-- InstructionSimplify.h - Fold instructions into simpler forms ------===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| //
 | |
| // This file declares routines for folding instructions into simpler forms
 | |
| // that do not require creating new instructions.  This does constant folding
 | |
| // ("add i32 1, 1" -> "2") but can also handle non-constant operands, either
 | |
| // returning a constant ("and i32 %x, 0" -> "0") or an already existing value
 | |
| // ("and i32 %x, %x" -> "%x").  If the simplification is also an instruction
 | |
| // then it dominates the original instruction.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #ifndef LLVM_ANALYSIS_INSTRUCTIONSIMPLIFY_H
 | |
| #define LLVM_ANALYSIS_INSTRUCTIONSIMPLIFY_H
 | |
| 
 | |
| namespace llvm {
 | |
|   class DominatorTree;
 | |
|   class Instruction;
 | |
|   class Value;
 | |
|   class TargetData;
 | |
| 
 | |
|   /// SimplifyAddInst - Given operands for an Add, see if we can
 | |
|   /// fold the result.  If not, this returns null.
 | |
|   Value *SimplifyAddInst(Value *LHS, Value *RHS, bool isNSW, bool isNUW,
 | |
|                          const TargetData *TD = 0, const DominatorTree *DT = 0);
 | |
| 
 | |
|   /// SimplifySubInst - Given operands for a Sub, see if we can
 | |
|   /// fold the result.  If not, this returns null.
 | |
|   Value *SimplifySubInst(Value *LHS, Value *RHS, bool isNSW, bool isNUW,
 | |
|                          const TargetData *TD = 0, const DominatorTree *DT = 0);
 | |
| 
 | |
|   /// SimplifyMulInst - Given operands for a Mul, see if we can
 | |
|   /// fold the result.  If not, this returns null.
 | |
|   Value *SimplifyMulInst(Value *LHS, Value *RHS, const TargetData *TD = 0,
 | |
|                          const DominatorTree *DT = 0);
 | |
| 
 | |
|   /// SimplifySDivInst - Given operands for an SDiv, see if we can
 | |
|   /// fold the result.  If not, this returns null.
 | |
|   Value *SimplifySDivInst(Value *LHS, Value *RHS, const TargetData *TD = 0,
 | |
|                           const DominatorTree *DT = 0);
 | |
| 
 | |
|   /// SimplifyUDivInst - Given operands for a UDiv, see if we can
 | |
|   /// fold the result.  If not, this returns null.
 | |
|   Value *SimplifyUDivInst(Value *LHS, Value *RHS, const TargetData *TD = 0,
 | |
|                           const DominatorTree *DT = 0);
 | |
| 
 | |
|   /// SimplifyFDivInst - Given operands for an FDiv, see if we can
 | |
|   /// fold the result.  If not, this returns null.
 | |
|   Value *SimplifyFDivInst(Value *LHS, Value *RHS, const TargetData *TD = 0,
 | |
|                           const DominatorTree *DT = 0);
 | |
| 
 | |
|   /// SimplifySRemInst - Given operands for an SRem, see if we can
 | |
|   /// fold the result.  If not, this returns null.
 | |
|   Value *SimplifySRemInst(Value *LHS, Value *RHS, const TargetData *TD = 0,
 | |
|                           const DominatorTree *DT = 0);
 | |
| 
 | |
|   /// SimplifyURemInst - Given operands for a URem, see if we can
 | |
|   /// fold the result.  If not, this returns null.
 | |
|   Value *SimplifyURemInst(Value *LHS, Value *RHS, const TargetData *TD = 0,
 | |
|                           const DominatorTree *DT = 0);
 | |
| 
 | |
|   /// SimplifyFRemInst - Given operands for an FRem, see if we can
 | |
|   /// fold the result.  If not, this returns null.
 | |
|   Value *SimplifyFRemInst(Value *LHS, Value *RHS, const TargetData *TD = 0,
 | |
|                           const DominatorTree *DT = 0);
 | |
| 
 | |
|   /// SimplifyShlInst - Given operands for a Shl, see if we can
 | |
|   /// fold the result.  If not, this returns null.
 | |
|   Value *SimplifyShlInst(Value *Op0, Value *Op1, bool isNSW, bool isNUW,
 | |
|                          const TargetData *TD = 0, const DominatorTree *DT = 0);
 | |
| 
 | |
|   /// SimplifyLShrInst - Given operands for a LShr, see if we can
 | |
|   /// fold the result.  If not, this returns null.
 | |
|   Value *SimplifyLShrInst(Value *Op0, Value *Op1, bool isExact,
 | |
|                           const TargetData *TD = 0, const DominatorTree *DT=0);
 | |
| 
 | |
|   /// SimplifyAShrInst - Given operands for a AShr, see if we can
 | |
|   /// fold the result.  If not, this returns null.
 | |
|   Value *SimplifyAShrInst(Value *Op0, Value *Op1, bool isExact,
 | |
|                           const TargetData *TD = 0,
 | |
|                           const DominatorTree *DT = 0);
 | |
| 
 | |
|   /// SimplifyAndInst - Given operands for an And, see if we can
 | |
|   /// fold the result.  If not, this returns null.
 | |
|   Value *SimplifyAndInst(Value *LHS, Value *RHS, const TargetData *TD = 0,
 | |
|                          const DominatorTree *DT = 0);
 | |
| 
 | |
|   /// SimplifyOrInst - Given operands for an Or, see if we can
 | |
|   /// fold the result.  If not, this returns null.
 | |
|   Value *SimplifyOrInst(Value *LHS, Value *RHS, const TargetData *TD = 0,
 | |
|                         const DominatorTree *DT = 0);
 | |
| 
 | |
|   /// SimplifyXorInst - Given operands for a Xor, see if we can
 | |
|   /// fold the result.  If not, this returns null.
 | |
|   Value *SimplifyXorInst(Value *LHS, Value *RHS, const TargetData *TD = 0,
 | |
|                          const DominatorTree *DT = 0);
 | |
| 
 | |
|   /// SimplifyICmpInst - Given operands for an ICmpInst, see if we can
 | |
|   /// fold the result.  If not, this returns null.
 | |
|   Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS,
 | |
|                           const TargetData *TD = 0,
 | |
|                           const DominatorTree *DT = 0);
 | |
| 
 | |
|   /// SimplifyFCmpInst - Given operands for an FCmpInst, see if we can
 | |
|   /// fold the result.  If not, this returns null.
 | |
|   Value *SimplifyFCmpInst(unsigned Predicate, Value *LHS, Value *RHS,
 | |
|                           const TargetData *TD = 0,
 | |
|                           const DominatorTree *DT = 0);
 | |
| 
 | |
|   /// SimplifySelectInst - Given operands for a SelectInst, see if we can fold
 | |
|   /// the result.  If not, this returns null.
 | |
|   Value *SimplifySelectInst(Value *Cond, Value *TrueVal, Value *FalseVal,
 | |
|                             const TargetData *TD = 0,
 | |
|                             const DominatorTree *DT = 0);
 | |
| 
 | |
|   /// SimplifyGEPInst - Given operands for an GetElementPtrInst, see if we can
 | |
|   /// fold the result.  If not, this returns null.
 | |
|   Value *SimplifyGEPInst(Value * const *Ops, unsigned NumOps,
 | |
|                          const TargetData *TD = 0, const DominatorTree *DT = 0);
 | |
| 
 | |
|   //=== Helper functions for higher up the class hierarchy.
 | |
| 
 | |
| 
 | |
|   /// SimplifyCmpInst - Given operands for a CmpInst, see if we can
 | |
|   /// fold the result.  If not, this returns null.
 | |
|   Value *SimplifyCmpInst(unsigned Predicate, Value *LHS, Value *RHS,
 | |
|                          const TargetData *TD = 0, const DominatorTree *DT = 0);
 | |
| 
 | |
|   /// SimplifyBinOp - Given operands for a BinaryOperator, see if we can
 | |
|   /// fold the result.  If not, this returns null.
 | |
|   Value *SimplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS,
 | |
|                        const TargetData *TD = 0, const DominatorTree *DT = 0);
 | |
| 
 | |
|   /// SimplifyInstruction - See if we can compute a simplified version of this
 | |
|   /// instruction.  If not, this returns null.
 | |
|   Value *SimplifyInstruction(Instruction *I, const TargetData *TD = 0,
 | |
|                              const DominatorTree *DT = 0);
 | |
| 
 | |
| 
 | |
|   /// ReplaceAndSimplifyAllUses - Perform From->replaceAllUsesWith(To) and then
 | |
|   /// delete the From instruction.  In addition to a basic RAUW, this does a
 | |
|   /// recursive simplification of the updated instructions.  This catches
 | |
|   /// things where one simplification exposes other opportunities.  This only
 | |
|   /// simplifies and deletes scalar operations, it does not change the CFG.
 | |
|   ///
 | |
|   void ReplaceAndSimplifyAllUses(Instruction *From, Value *To,
 | |
|                                  const TargetData *TD = 0,
 | |
|                                  const DominatorTree *DT = 0);
 | |
| } // end namespace llvm
 | |
| 
 | |
| #endif
 | |
| 
 |