diff options
| -rw-r--r-- | llvm/include/llvm/Analysis/InstructionSimplify.h | 269 | 
1 files changed, 134 insertions, 135 deletions
diff --git a/llvm/include/llvm/Analysis/InstructionSimplify.h b/llvm/include/llvm/Analysis/InstructionSimplify.h index bf73e099a2b..ca48b548351 100644 --- a/llvm/include/llvm/Analysis/InstructionSimplify.h +++ b/llvm/include/llvm/Analysis/InstructionSimplify.h @@ -70,174 +70,173 @@ struct SimplifyQuery {      Copy.CxtI = I;      return Copy;    } -  }; +}; -  // NOTE: the explicit multiple argument versions of these functions are -  // deprecated. -  // Please use the SimplifyQuery versions in new code. +// NOTE: the explicit multiple argument versions of these functions are +// deprecated. +// Please use the SimplifyQuery versions in new code. -  /// Given operands for an Add, fold the result or return null. -  Value *SimplifyAddInst(Value *LHS, Value *RHS, bool isNSW, bool isNUW, +/// Given operands for an Add, fold the result or return null. +Value *SimplifyAddInst(Value *LHS, Value *RHS, bool isNSW, bool isNUW,                         const SimplifyQuery &Q); -  /// Given operands for a Sub, fold the result or return null. -  Value *SimplifySubInst(Value *LHS, Value *RHS, bool isNSW, bool isNUW, -                         const SimplifyQuery &Q); +/// Given operands for a Sub, fold the result or return null. +Value *SimplifySubInst(Value *LHS, Value *RHS, bool isNSW, bool isNUW, +                       const SimplifyQuery &Q); -  /// Given operands for an FAdd, fold the result or return null. -  Value *SimplifyFAddInst(Value *LHS, Value *RHS, FastMathFlags FMF, -                          const SimplifyQuery &Q); +/// Given operands for an FAdd, fold the result or return null. +Value *SimplifyFAddInst(Value *LHS, Value *RHS, FastMathFlags FMF, +                        const SimplifyQuery &Q); -  /// Given operands for an FSub, fold the result or return null. -  Value *SimplifyFSubInst(Value *LHS, Value *RHS, FastMathFlags FMF, -                          const SimplifyQuery &Q); +/// Given operands for an FSub, fold the result or return null. +Value *SimplifyFSubInst(Value *LHS, Value *RHS, FastMathFlags FMF, +                        const SimplifyQuery &Q); -  /// Given operands for an FMul, fold the result or return null. -  Value *SimplifyFMulInst(Value *LHS, Value *RHS, FastMathFlags FMF, -                          const SimplifyQuery &Q); +/// Given operands for an FMul, fold the result or return null. +Value *SimplifyFMulInst(Value *LHS, Value *RHS, FastMathFlags FMF, +                        const SimplifyQuery &Q); -  /// Given operands for a Mul, fold the result or return null. -  Value *SimplifyMulInst(Value *LHS, Value *RHS, const SimplifyQuery &Q); +/// Given operands for a Mul, fold the result or return null. +Value *SimplifyMulInst(Value *LHS, Value *RHS, const SimplifyQuery &Q); -  /// Given operands for an SDiv, fold the result or return null. -  Value *SimplifySDivInst(Value *LHS, Value *RHS, const SimplifyQuery &Q); +/// Given operands for an SDiv, fold the result or return null. +Value *SimplifySDivInst(Value *LHS, Value *RHS, const SimplifyQuery &Q); -  /// Given operands for a UDiv, fold the result or return null. -  Value *SimplifyUDivInst(Value *LHS, Value *RHS, const SimplifyQuery &Q); +/// Given operands for a UDiv, fold the result or return null. +Value *SimplifyUDivInst(Value *LHS, Value *RHS, const SimplifyQuery &Q); -  /// Given operands for an FDiv, fold the result or return null. -  Value *SimplifyFDivInst(Value *LHS, Value *RHS, FastMathFlags FMF, -                          const SimplifyQuery &Q); +/// Given operands for an FDiv, fold the result or return null. +Value *SimplifyFDivInst(Value *LHS, Value *RHS, FastMathFlags FMF, +                        const SimplifyQuery &Q); -  /// Given operands for an SRem, fold the result or return null. -  Value *SimplifySRemInst(Value *LHS, Value *RHS, const SimplifyQuery &Q); +/// Given operands for an SRem, fold the result or return null. +Value *SimplifySRemInst(Value *LHS, Value *RHS, const SimplifyQuery &Q); -  /// Given operands for a URem, fold the result or return null. -  Value *SimplifyURemInst(Value *LHS, Value *RHS, const SimplifyQuery &Q); +/// Given operands for a URem, fold the result or return null. +Value *SimplifyURemInst(Value *LHS, Value *RHS, const SimplifyQuery &Q); -  /// Given operands for an FRem, fold the result or return null. -  Value *SimplifyFRemInst(Value *LHS, Value *RHS, FastMathFlags FMF, -                          const SimplifyQuery &Q); - -  /// Given operands for a Shl, fold the result or return null. -  Value *SimplifyShlInst(Value *Op0, Value *Op1, bool isNSW, bool isNUW, -                         const SimplifyQuery &Q); - -  /// Given operands for a LShr, fold the result or return null. -  Value *SimplifyLShrInst(Value *Op0, Value *Op1, bool isExact, -                          const SimplifyQuery &Q); +/// Given operands for an FRem, fold the result or return null. +Value *SimplifyFRemInst(Value *LHS, Value *RHS, FastMathFlags FMF, +                        const SimplifyQuery &Q); -  /// Given operands for a AShr, fold the result or return nulll. -  Value *SimplifyAShrInst(Value *Op0, Value *Op1, bool isExact, -                          const SimplifyQuery &Q); +/// Given operands for a Shl, fold the result or return null. +Value *SimplifyShlInst(Value *Op0, Value *Op1, bool isNSW, bool isNUW, +                       const SimplifyQuery &Q); -  /// Given operands for an And, fold the result or return null. -  Value *SimplifyAndInst(Value *LHS, Value *RHS, const SimplifyQuery &Q); +/// Given operands for a LShr, fold the result or return null. +Value *SimplifyLShrInst(Value *Op0, Value *Op1, bool isExact, +                        const SimplifyQuery &Q); -  /// Given operands for an Or, fold the result or return null. -  Value *SimplifyOrInst(Value *LHS, Value *RHS, const SimplifyQuery &Q); +/// Given operands for a AShr, fold the result or return nulll. +Value *SimplifyAShrInst(Value *Op0, Value *Op1, bool isExact, +                        const SimplifyQuery &Q); -  /// Given operands for an Xor, fold the result or return null. -  Value *SimplifyXorInst(Value *LHS, Value *RHS, const SimplifyQuery &Q); +/// Given operands for an And, fold the result or return null. +Value *SimplifyAndInst(Value *LHS, Value *RHS, const SimplifyQuery &Q); -  /// Given operands for an ICmpInst, fold the result or return null. -  Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS, -                          const SimplifyQuery &Q); +/// Given operands for an Or, fold the result or return null. +Value *SimplifyOrInst(Value *LHS, Value *RHS, const SimplifyQuery &Q); -  /// Given operands for an FCmpInst, fold the result or return null. -  Value *SimplifyFCmpInst(unsigned Predicate, Value *LHS, Value *RHS, -                          FastMathFlags FMF, const SimplifyQuery &Q); +/// Given operands for an Xor, fold the result or return null. +Value *SimplifyXorInst(Value *LHS, Value *RHS, const SimplifyQuery &Q); -  /// Given operands for a SelectInst, fold the result or return null. -  Value *SimplifySelectInst(Value *Cond, Value *TrueVal, Value *FalseVal, -                            const SimplifyQuery &Q); +/// Given operands for an ICmpInst, fold the result or return null. +Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS, +                        const SimplifyQuery &Q); -  /// Given operands for a GetElementPtrInst, fold the result or return null.  -  Value *SimplifyGEPInst(Type *SrcTy, ArrayRef<Value *> Ops, -                         const SimplifyQuery &Q); +/// Given operands for an FCmpInst, fold the result or return null. +Value *SimplifyFCmpInst(unsigned Predicate, Value *LHS, Value *RHS, +                        FastMathFlags FMF, const SimplifyQuery &Q); -  /// Given operands for an InsertValueInst, fold the result or return null. -  Value *SimplifyInsertValueInst(Value *Agg, Value *Val, -                                 ArrayRef<unsigned> Idxs, -                                 const SimplifyQuery &Q); +/// Given operands for a SelectInst, fold the result or return null. +Value *SimplifySelectInst(Value *Cond, Value *TrueVal, Value *FalseVal, +                          const SimplifyQuery &Q); -  /// Given operands for an ExtractValueInst, fold the result or return null. -  Value *SimplifyExtractValueInst(Value *Agg, ArrayRef<unsigned> Idxs, -                                  const SimplifyQuery &Q); +/// Given operands for a GetElementPtrInst, fold the result or return null. +Value *SimplifyGEPInst(Type *SrcTy, ArrayRef<Value *> Ops, +                       const SimplifyQuery &Q); -  /// Given operands for an ExtractElementInst, fold the result or return null. -  Value *SimplifyExtractElementInst(Value *Vec, Value *Idx, -                                    const SimplifyQuery &Q); +/// Given operands for an InsertValueInst, fold the result or return null. +Value *SimplifyInsertValueInst(Value *Agg, Value *Val, ArrayRef<unsigned> Idxs, +                               const SimplifyQuery &Q); -  /// Given operands for a CastInst, fold the result or return null. -  Value *SimplifyCastInst(unsigned CastOpc, Value *Op, Type *Ty, -                          const SimplifyQuery &Q); +/// Given operands for an ExtractValueInst, fold the result or return null. +Value *SimplifyExtractValueInst(Value *Agg, ArrayRef<unsigned> Idxs, +                                const SimplifyQuery &Q); -  /// Given operands for a ShuffleVectorInst, fold the result or return null. -  Value *SimplifyShuffleVectorInst(Value *Op0, Value *Op1, Constant *Mask, -                                   Type *RetTy, const SimplifyQuery &Q); +/// Given operands for an ExtractElementInst, fold the result or return null. +Value *SimplifyExtractElementInst(Value *Vec, Value *Idx, +                                  const SimplifyQuery &Q); -  //=== Helper functions for higher up the class hierarchy. +/// Given operands for a CastInst, fold the result or return null. +Value *SimplifyCastInst(unsigned CastOpc, Value *Op, Type *Ty, +                        const SimplifyQuery &Q); +/// Given operands for a ShuffleVectorInst, fold the result or return null. +Value *SimplifyShuffleVectorInst(Value *Op0, Value *Op1, Constant *Mask, +                                 Type *RetTy, const SimplifyQuery &Q); -  /// Given operands for a CmpInst, fold the result or return null. -  Value *SimplifyCmpInst(unsigned Predicate, Value *LHS, Value *RHS, -                         const SimplifyQuery &Q); +//=== Helper functions for higher up the class hierarchy. -  /// Given operands for a BinaryOperator, fold the result or return null. -  Value *SimplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS, +/// Given operands for a CmpInst, fold the result or return null. +Value *SimplifyCmpInst(unsigned Predicate, Value *LHS, Value *RHS,                         const SimplifyQuery &Q); -  /// Given operands for an FP BinaryOperator, fold the result or return null. -  /// In contrast to SimplifyBinOp, try to use FastMathFlag when folding the -  /// result. In case we don't need FastMathFlags, simply fall to SimplifyBinOp. -  Value *SimplifyFPBinOp(unsigned Opcode, Value *LHS, Value *RHS, -                         FastMathFlags FMF, const SimplifyQuery &Q); - -  /// Given a function and iterators over arguments, fold the result or return -  /// null. -  Value *SimplifyCall(Value *V, User::op_iterator ArgBegin, -                      User::op_iterator ArgEnd, const SimplifyQuery &Q); - -  /// Given a function and set of arguments, fold the result or return null. -  Value *SimplifyCall(Value *V, ArrayRef<Value *> Args, const SimplifyQuery &Q); - -  /// See if we can compute a simplified version of this instruction. If not, -  /// return null. -  Value *SimplifyInstruction(Instruction *I, const SimplifyQuery &Q, -                             OptimizationRemarkEmitter *ORE = nullptr); - -  /// Replace all uses of 'I' with 'SimpleV' and simplify the uses recursively. -  /// -  /// This first performs a normal RAUW of I with SimpleV. It then recursively -  /// attempts to simplify those users updated by the operation. The 'I' -  /// instruction must not be equal to the simplified value 'SimpleV'. -  /// -  /// The function returns true if any simplifications were performed. -  bool replaceAndRecursivelySimplify(Instruction *I, Value *SimpleV, -                                     const TargetLibraryInfo *TLI = nullptr, -                                     const DominatorTree *DT = nullptr, -                                     AssumptionCache *AC = nullptr); - -  /// Recursively attempt to simplify an instruction. -  /// -  /// This routine uses SimplifyInstruction to simplify 'I', and if successful -  /// replaces uses of 'I' with the simplified value. It then recurses on each -  /// of the users impacted. It returns true if any simplifications were -  /// performed. -  bool recursivelySimplifyInstruction(Instruction *I, -                                      const TargetLibraryInfo *TLI = nullptr, -                                      const DominatorTree *DT = nullptr, -                                      AssumptionCache *AC = nullptr); -  // These helper functions return a SimplifyQuery structure that contains as -  // many of the optional analysis we use as are currently valid.  This is the -  // strongly preferred way of constructing SimplifyQuery in passes. -  const SimplifyQuery getBestSimplifyQuery(Pass &, Function &); -  template <class T, class... TArgs> -  const SimplifyQuery getBestSimplifyQuery(AnalysisManager<T, TArgs...> &, -                                           Function &); -  const SimplifyQuery getBestSimplifyQuery(LoopStandardAnalysisResults &, -                                           const DataLayout &); +/// Given operands for a BinaryOperator, fold the result or return null. +Value *SimplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS, +                     const SimplifyQuery &Q); + +/// Given operands for an FP BinaryOperator, fold the result or return null. +/// In contrast to SimplifyBinOp, try to use FastMathFlag when folding the +/// result. In case we don't need FastMathFlags, simply fall to SimplifyBinOp. +Value *SimplifyFPBinOp(unsigned Opcode, Value *LHS, Value *RHS, +                       FastMathFlags FMF, const SimplifyQuery &Q); + +/// Given a function and iterators over arguments, fold the result or return +/// null. +Value *SimplifyCall(Value *V, User::op_iterator ArgBegin, +                    User::op_iterator ArgEnd, const SimplifyQuery &Q); + +/// Given a function and set of arguments, fold the result or return null. +Value *SimplifyCall(Value *V, ArrayRef<Value *> Args, const SimplifyQuery &Q); + +/// See if we can compute a simplified version of this instruction. If not, +/// return null. +Value *SimplifyInstruction(Instruction *I, const SimplifyQuery &Q, +                           OptimizationRemarkEmitter *ORE = nullptr); + +/// Replace all uses of 'I' with 'SimpleV' and simplify the uses recursively. +/// +/// This first performs a normal RAUW of I with SimpleV. It then recursively +/// attempts to simplify those users updated by the operation. The 'I' +/// instruction must not be equal to the simplified value 'SimpleV'. +/// +/// The function returns true if any simplifications were performed. +bool replaceAndRecursivelySimplify(Instruction *I, Value *SimpleV, +                                   const TargetLibraryInfo *TLI = nullptr, +                                   const DominatorTree *DT = nullptr, +                                   AssumptionCache *AC = nullptr); + +/// Recursively attempt to simplify an instruction. +/// +/// This routine uses SimplifyInstruction to simplify 'I', and if successful +/// replaces uses of 'I' with the simplified value. It then recurses on each +/// of the users impacted. It returns true if any simplifications were +/// performed. +bool recursivelySimplifyInstruction(Instruction *I, +                                    const TargetLibraryInfo *TLI = nullptr, +                                    const DominatorTree *DT = nullptr, +                                    AssumptionCache *AC = nullptr); + +// These helper functions return a SimplifyQuery structure that contains as +// many of the optional analysis we use as are currently valid.  This is the +// strongly preferred way of constructing SimplifyQuery in passes. +const SimplifyQuery getBestSimplifyQuery(Pass &, Function &); +template <class T, class... TArgs> +const SimplifyQuery getBestSimplifyQuery(AnalysisManager<T, TArgs...> &, +                                         Function &); +const SimplifyQuery getBestSimplifyQuery(LoopStandardAnalysisResults &, +                                         const DataLayout &);  } // end namespace llvm  #endif  | 

