LLVM 24.0.0git
llvm::CombinerHelper Class Reference

#include "llvm/CodeGen/GlobalISel/CombinerHelper.h"

Inheritance diagram for llvm::CombinerHelper:
[legend]

Public Member Functions

LLVM_ABI CombinerHelper (GISelChangeObserver &Observer, MachineIRBuilder &B, bool IsPreLegalize, GISelValueTracking *VT=nullptr, MachineDominatorTree *MDT=nullptr, const LegalizerInfo *LI=nullptr)
GISelValueTrackinggetValueTracking () const
MachineIRBuildergetBuilder () const
const TargetInstrInfogetTII () const
const TargetRegisterInfogetTRI () const
const RegisterBankInfogetRBI () const
LLVM_ABI const TargetLoweringgetTargetLowering () const
LLVM_ABI const MachineFunctiongetMachineFunction () const
LLVM_ABI const DataLayoutgetDataLayout () const
LLVM_ABI LLVMContextgetContext () const
LLVM_ABI bool isPreLegalize () const
LLVM_ABI bool isLegal (const LegalityQuery &Query) const
LLVM_ABI bool isLegalOrBeforeLegalizer (const LegalityQuery &Query) const
LLVM_ABI bool isLegalOrHasWidenScalar (const LegalityQuery &Query) const
LLVM_ABI bool isLegalOrHasFewerElements (const LegalityQuery &Query) const
LLVM_ABI bool isConstantLegalOrBeforeLegalizer (const LLT Ty) const
LLVM_ABI void replaceRegWith (MachineRegisterInfo &MRI, Register FromReg, Register ToReg) const
 MachineRegisterInfo::replaceRegWith() and inform the observer of the changes.
LLVM_ABI void replaceRegOpWith (MachineRegisterInfo &MRI, MachineOperand &FromRegOp, Register ToReg) const
 Replace a single register operand with a new register and inform the observer of the changes.
LLVM_ABI void replaceOpcodeWith (MachineInstr &FromMI, unsigned ToOpcode) const
 Replace the opcode in instruction with a new opcode and inform the observer of the changes.
LLVM_ABI const RegisterBankgetRegBank (Register Reg) const
 Get the register bank of Reg.
LLVM_ABI void setRegBank (Register Reg, const RegisterBank *RegBank) const
 Set the register bank of Reg.
LLVM_ABI bool tryCombineCopy (MachineInstr &MI) const
 If MI is COPY, try to combine it.
LLVM_ABI bool matchCombineCopy (MachineInstr &MI) const
LLVM_ABI void applyCombineCopy (MachineInstr &MI) const
LLVM_ABI bool isPredecessor (const MachineInstr &DefMI, const MachineInstr &UseMI) const
 Returns true if DefMI precedes UseMI or they are the same instruction.
LLVM_ABI bool dominates (const MachineInstr &DefMI, const MachineInstr &UseMI) const
 Returns true if DefMI dominates UseMI.
LLVM_ABI bool tryCombineExtendingLoads (MachineInstr &MI) const
 If MI is extend that consumes the result of a load, try to combine it.
LLVM_ABI bool matchCombineExtendingLoads (MachineInstr &MI, PreferredTuple &MatchInfo) const
LLVM_ABI void applyCombineExtendingLoads (MachineInstr &MI, PreferredTuple &MatchInfo) const
LLVM_ABI bool matchCombineLoadWithAndMask (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Match (and (load x), mask) -> zextload x.
LLVM_ABI bool matchCombineExtractedVectorLoad (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Combine a G_EXTRACT_VECTOR_ELT of a load into a narrowed load.
LLVM_ABI bool matchCombineIndexedLoadStore (MachineInstr &MI, IndexedLoadStoreMatchInfo &MatchInfo) const
LLVM_ABI void applyCombineIndexedLoadStore (MachineInstr &MI, IndexedLoadStoreMatchInfo &MatchInfo) const
LLVM_ABI bool matchSextTruncSextLoad (MachineInstr &MI) const
LLVM_ABI bool matchSextInRegOfLoad (MachineInstr &MI, std::tuple< Register, unsigned > &MatchInfo) const
 Match sext_inreg(load p), imm -> sextload p.
LLVM_ABI void applySextInRegOfLoad (MachineInstr &MI, std::tuple< Register, unsigned > &MatchInfo) const
LLVM_ABI bool matchCombineDivRem (MachineInstr &MI, MachineInstr *&OtherMI) const
 Try to combine G_[SU]DIV and G_[SU]REM into a single G_[SU]DIVREM when their source operands are identical.
LLVM_ABI void applyCombineDivRem (MachineInstr &MI, MachineInstr *&OtherMI) const
LLVM_ABI bool matchOptBrCondByInvertingCond (MachineInstr &MI, MachineInstr *&BrCond) const
 If a brcond's true block is not the fallthrough, make it so by inverting the condition and swapping operands.
LLVM_ABI void applyOptBrCondByInvertingCond (MachineInstr &MI, MachineInstr *&BrCond) const
LLVM_ABI bool matchCombineConcatVectors (MachineInstr &MI, SmallVector< Register > &Ops) const
 If MI is G_CONCAT_VECTORS, try to combine it.
LLVM_ABI void applyCombineConcatVectors (MachineInstr &MI, SmallVector< Register > &Ops) const
 Replace MI with a flattened build_vector with Ops or an implicit_def if Ops is empty.
LLVM_ABI bool matchCombineShuffleConcat (MachineInstr &MI, SmallVector< Register > &Ops) const
LLVM_ABI void applyCombineShuffleConcat (MachineInstr &MI, SmallVector< Register > &Ops) const
 Replace MI with a flattened build_vector with Ops or an implicit_def if Ops is empty.
LLVM_ABI void applyCombineShuffleToBuildVector (MachineInstr &MI) const
 Replace MI with a build_vector.
LLVM_ABI bool matchCombineBuildVectorOfBitcast (MachineInstr &MI, SmallVector< Register > &Ops) const
 Combine G_BUILD_VECTOR(G_UNMERGE(G_BITCAST), Undef) to G_BITCAST(G_BUILD_VECTOR(..))
LLVM_ABI void applyCombineBuildVectorOfBitcast (MachineInstr &MI, SmallVector< Register > &Ops) const
LLVM_ABI bool matchCombineShuffleVector (MachineInstr &MI, SmallVectorImpl< Register > &Ops) const
 Check if the G_SHUFFLE_VECTOR MI can be replaced by a concat_vectors.
LLVM_ABI void applyCombineShuffleVector (MachineInstr &MI, ArrayRef< Register > Ops) const
 Replace MI with a concat_vectors with Ops.
LLVM_ABI bool tryCombineMemCpyFamily (MachineInstr &MI, unsigned MaxLen=0) const
 Optimize memcpy intrinsics et al, e.g.
LLVM_ABI bool matchCombineMemCpyFamily (MachineInstr &MI, MemCpyFamilyLoweringInfo &MatchInfo, unsigned MaxLen=0) const
LLVM_ABI void applyCombineMemCpyFamily (MachineInstr &MI, MemCpyFamilyLoweringInfo &MatchInfo) const
LLVM_ABI bool matchPtrAddImmedChain (MachineInstr &MI, PtrAddChain &MatchInfo) const
LLVM_ABI void applyPtrAddImmedChain (MachineInstr &MI, PtrAddChain &MatchInfo) const
LLVM_ABI bool matchShiftImmedChain (MachineInstr &MI, RegisterImmPair &MatchInfo) const
 Fold (shift (shift base, x), y) -> (shift base (x+y))
LLVM_ABI void applyShiftImmedChain (MachineInstr &MI, RegisterImmPair &MatchInfo) const
LLVM_ABI bool matchShiftOfShiftedLogic (MachineInstr &MI, ShiftOfShiftedLogic &MatchInfo) const
 If we have a shift-by-constant of a bitwise logic op that itself has a shift-by-constant operand with identical opcode, we may be able to convert that into 2 independent shifts followed by the logic op.
LLVM_ABI void applyShiftOfShiftedLogic (MachineInstr &MI, ShiftOfShiftedLogic &MatchInfo) const
LLVM_ABI bool isDesirableToCommuteWithShift (const MachineInstr &MI) const
LLVM_ABI bool matchLshrOfTruncOfLshr (MachineInstr &MI, LshrOfTruncOfLshr &MatchInfo, MachineInstr &ShiftMI) const
 Fold (lshr (trunc (lshr x, C1)), C2) -> trunc (shift x, (C1 + C2))
LLVM_ABI void applyLshrOfTruncOfLshr (MachineInstr &MI, LshrOfTruncOfLshr &MatchInfo) const
LLVM_ABI bool matchCombineMulToShl (MachineInstr &MI, unsigned &ShiftVal) const
 Transform a multiply by a power-of-2 value to a left shift.
LLVM_ABI void applyCombineMulToShl (MachineInstr &MI, unsigned &ShiftVal) const
LLVM_ABI bool matchCombineSubToAdd (MachineInstr &MI, BuildFnTy &MatchInfo) const
LLVM_ABI bool matchCombineShlOfExtend (MachineInstr &MI, RegisterImmPair &MatchData) const
LLVM_ABI void applyCombineShlOfExtend (MachineInstr &MI, const RegisterImmPair &MatchData) const
LLVM_ABI bool matchCombineMergeUnmerge (MachineInstr &MI, Register &MatchInfo) const
 Fold away a merge of an unmerge of the corresponding values.
LLVM_ABI bool matchCombineShiftToUnmerge (MachineInstr &MI, unsigned TargetShiftSize, unsigned &ShiftVal) const
 Reduce a shift by a constant to an unmerge and a shift on a half sized type.
LLVM_ABI void applyCombineShiftToUnmerge (MachineInstr &MI, const unsigned &ShiftVal) const
LLVM_ABI bool tryCombineShiftToUnmerge (MachineInstr &MI, unsigned TargetShiftAmount) const
LLVM_ABI bool matchCombineUnmergeMergeToPlainValues (MachineInstr &MI, SmallVectorImpl< Register > &Operands) const
 Transform <ty,...> G_UNMERGE(G_MERGE ty X, Y, Z) -> ty X, Y, Z.
LLVM_ABI void applyCombineUnmergeMergeToPlainValues (MachineInstr &MI, SmallVectorImpl< Register > &Operands) const
LLVM_ABI bool matchCombineUnmergeConstant (MachineInstr &MI, SmallVectorImpl< APInt > &Csts) const
 Transform G_UNMERGE Constant -> Constant1, Constant2, ...
LLVM_ABI void applyCombineUnmergeConstant (MachineInstr &MI, SmallVectorImpl< APInt > &Csts) const
LLVM_ABI bool matchCombineUnmergeUndef (MachineInstr &MI, std::function< void(MachineIRBuilder &)> &MatchInfo) const
 Transform G_UNMERGE G_IMPLICIT_DEF -> G_IMPLICIT_DEF, G_IMPLICIT_DEF, ...
LLVM_ABI bool matchCombineUnmergeWithDeadLanesToTrunc (MachineInstr &MI) const
 Transform X, Y<dead> = G_UNMERGE Z -> X = G_TRUNC Z.
LLVM_ABI void applyCombineUnmergeWithDeadLanesToTrunc (MachineInstr &MI) const
LLVM_ABI bool matchCombineUnmergeZExtToZExt (MachineInstr &MI) const
 Transform X, Y = G_UNMERGE(G_ZEXT(Z)) -> X = G_ZEXT(Z); Y = G_CONSTANT 0.
LLVM_ABI void applyCombineUnmergeZExtToZExt (MachineInstr &MI) const
LLVM_ABI void applyCombineConstantFoldFpUnary (MachineInstr &MI, const ConstantFP *Cst) const
 Transform fp_instr(cst) to constant result of the fp operation.
LLVM_ABI bool matchConstantFoldUnaryIntOp (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Constant fold a unary integer op (G_CTLZ, G_CTTZ, G_CTPOP and their _ZERO_POISON variants, G_ABS, G_BSWAP, G_BITREVERSE) when the operand is a scalar constant or a G_BUILD_VECTOR of constants.
LLVM_ABI void applyCombineP2IToI2P (MachineInstr &MI, Register &Reg) const
 Transform PtrToInt(IntToPtr(x)) to x.
LLVM_ABI bool matchCombineAddP2IToPtrAdd (MachineInstr &MI, std::pair< Register, bool > &PtrRegAndCommute) const
 Transform G_ADD (G_PTRTOINT x), y -> G_PTRTOINT (G_PTR_ADD x, y) Transform G_ADD y, (G_PTRTOINT x) -> G_PTRTOINT (G_PTR_ADD x, y)
LLVM_ABI void applyCombineAddP2IToPtrAdd (MachineInstr &MI, std::pair< Register, bool > &PtrRegAndCommute) const
LLVM_ABI bool matchCombineConstPtrAddToI2P (MachineInstr &MI, APInt &NewCst) const
LLVM_ABI void applyCombineConstPtrAddToI2P (MachineInstr &MI, APInt &NewCst) const
LLVM_ABI bool matchCombineAnyExtTrunc (MachineInstr &MI, Register &Reg) const
 Transform anyext(trunc(x)) to x.
LLVM_ABI bool matchCombineZextTrunc (MachineInstr &MI, Register &Reg) const
 Transform zext(trunc(x)) to x.
LLVM_ABI bool matchCombineTruncOfShift (MachineInstr &MI, std::pair< MachineInstr *, LLT > &MatchInfo) const
 Transform trunc (shl x, K) to shl (trunc x), K if K < VT.getScalarSizeInBits().
LLVM_ABI void applyCombineTruncOfShift (MachineInstr &MI, std::pair< MachineInstr *, LLT > &MatchInfo) const
LLVM_ABI bool matchAllExplicitUsesAreUndef (MachineInstr &MI) const
 Return true if all register explicit use operands on MI are defined by a G_IMPLICIT_DEF.
LLVM_ABI bool matchUndefShuffleVectorMask (MachineInstr &MI) const
 Return true if a G_SHUFFLE_VECTOR instruction MI has an undef mask.
LLVM_ABI bool matchUndefStore (MachineInstr &MI) const
 Return true if a G_STORE instruction MI is storing an undef value.
LLVM_ABI bool matchUndefSelectCmp (MachineInstr &MI) const
 Return true if a G_SELECT instruction MI has an undef comparison.
LLVM_ABI bool matchInsertExtractVecEltOutOfBounds (MachineInstr &MI) const
 Return true if a G_{EXTRACT,INSERT}_VECTOR_ELT has an out of range index.
LLVM_ABI bool matchConstantSelectCmp (MachineInstr &MI, unsigned &OpIdx) const
 Return true if a G_SELECT instruction MI has a constant comparison.
LLVM_ABI void replaceInstWithFConstant (MachineInstr &MI, double C) const
 Replace an instruction with a G_FCONSTANT with value C.
LLVM_ABI void replaceInstWithFConstant (MachineInstr &MI, ConstantFP *CFP) const
 Replace an instruction with an G_FCONSTANT with value CFP.
LLVM_ABI void replaceInstWithConstant (MachineInstr &MI, int64_t C) const
 Replace an instruction with a G_CONSTANT with value C.
LLVM_ABI void replaceInstWithConstant (MachineInstr &MI, APInt C) const
 Replace an instruction with a G_CONSTANT with value C.
LLVM_ABI void replaceInstWithUndef (MachineInstr &MI) const
 Replace an instruction with a G_IMPLICIT_DEF.
LLVM_ABI void replaceSingleDefInstWithOperand (MachineInstr &MI, unsigned OpIdx) const
 Delete MI and replace all of its uses with its OpIdx-th operand.
LLVM_ABI void replaceSingleDefInstWithReg (MachineInstr &MI, Register Replacement) const
 Delete MI and replace all of its uses with Replacement.
LLVM_ABI void applyFunnelShiftConstantModulo (MachineInstr &MI) const
 Replaces the shift amount in MI with ShiftAmt % BW.
LLVM_ABI bool matchEqualDefs (const MachineOperand &MOP1, const MachineOperand &MOP2) const
 Return true if MOP1 and MOP2 are register operands are defined by equivalent instructions.
LLVM_ABI bool matchConstantOp (const MachineOperand &MOP, int64_t C) const
 Return true if MOP is defined by a G_CONSTANT or splat with a value equal to C.
LLVM_ABI bool matchConstantFPOp (const MachineOperand &MOP, double C) const
 Return true if MOP is defined by a G_FCONSTANT or splat with a value exactly equal to C.
LLVM_ABI bool matchConstantLargerBitWidth (MachineInstr &MI, unsigned ConstIdx) const
 Checks if constant at ConstIdx is larger than MI 's bitwidth.
LLVM_ABI bool matchSelectSameVal (MachineInstr &MI) const
 Optimize (cond ? x : x) -> x.
LLVM_ABI bool matchBinOpSameVal (MachineInstr &MI) const
 Optimize (x op x) -> x.
LLVM_ABI bool matchOperandIsKnownToBeAPowerOfTwo (const MachineOperand &MO, bool OrNegative=false) const
 Check if operand MO is known to be a power of 2.
LLVM_ABI void eraseInst (MachineInstr &MI) const
 Erase MI.
LLVM_ABI bool matchSimplifyAddToSub (MachineInstr &MI, std::tuple< Register, Register > &MatchInfo) const
 Return true if MI is a G_ADD which can be simplified to a G_SUB.
LLVM_ABI void applySimplifyAddToSub (MachineInstr &MI, std::tuple< Register, Register > &MatchInfo) const
LLVM_ABI bool matchBinopWithNeg (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Fold a bitwiseop (~b +/- c) -> a bitwiseop ~(b -/+ c)
LLVM_ABI bool matchHoistLogicOpWithSameOpcodeHands (MachineInstr &MI, InstructionStepsMatchInfo &MatchInfo) const
 Match (logic_op (op x...), (op y...)) -> (op (logic_op x, y))
LLVM_ABI void applyBuildInstructionSteps (MachineInstr &MI, InstructionStepsMatchInfo &MatchInfo) const
 Replace MI with a series of instructions described in MatchInfo.
LLVM_ABI bool matchAshrShlToSextInreg (MachineInstr &MI, std::tuple< Register, int64_t > &MatchInfo) const
 Match ashr (shl x, C), C -> sext_inreg (C)
LLVM_ABI void applyAshShlToSextInreg (MachineInstr &MI, std::tuple< Register, int64_t > &MatchInfo) const
LLVM_ABI bool matchOverlappingAnd (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Fold and(and(x, C1), C2) -> C1&C2 ? and(x, C1&C2) : 0.
LLVM_ABI bool matchRedundantAnd (MachineInstr &MI, Register &Replacement) const
LLVM_ABI bool matchRedundantOr (MachineInstr &MI, Register &Replacement) const
LLVM_ABI bool matchRedundantSExtInReg (MachineInstr &MI) const
LLVM_ABI bool matchNotCmp (MachineInstr &MI, SmallVectorImpl< Register > &RegsToNegate) const
 Combine inverting a result of a compare into the opposite cond code.
LLVM_ABI void applyNotCmp (MachineInstr &MI, SmallVectorImpl< Register > &RegsToNegate) const
LLVM_ABI bool matchXorOfAndWithSameReg (MachineInstr &MI, std::pair< Register, Register > &MatchInfo) const
 Fold (xor (and x, y), y) -> (and (not x), y) {.
LLVM_ABI void applyXorOfAndWithSameReg (MachineInstr &MI, std::pair< Register, Register > &MatchInfo) const
LLVM_ABI bool matchPtrAddZero (MachineInstr &MI) const
 }
LLVM_ABI void applySimplifyURemByPow2 (MachineInstr &MI) const
 Combine G_UREM x, (known power of 2) to an add and bitmasking.
LLVM_ABI bool matchFoldBinOpIntoSelect (MachineInstr &MI, unsigned &SelectOpNo) const
 Push a binary operator through a select on constants.
LLVM_ABI void applyFoldBinOpIntoSelect (MachineInstr &MI, const unsigned &SelectOpNo) const
 SelectOperand is the operand in binary operator MI that is the select to fold.
LLVM_ABI bool matchCombineInsertVecElts (MachineInstr &MI, SmallVectorImpl< Register > &MatchInfo) const
LLVM_ABI void applyCombineInsertVecElts (MachineInstr &MI, SmallVectorImpl< Register > &MatchInfo) const
LLVM_ABI bool matchLoadOrCombine (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Match expression trees of the form.
LLVM_ABI bool matchExtendThroughPhis (MachineInstr &MI, MachineInstr *&ExtMI) const
LLVM_ABI void applyExtendThroughPhis (MachineInstr &MI, MachineInstr *&ExtMI) const
LLVM_ABI bool matchExtractVecEltBuildVec (MachineInstr &MI, Register &Reg) const
LLVM_ABI void applyExtractVecEltBuildVec (MachineInstr &MI, Register &Reg) const
LLVM_ABI bool matchExtractAllEltsFromBuildVector (MachineInstr &MI, SmallVectorImpl< std::pair< Register, MachineInstr * > > &MatchInfo) const
LLVM_ABI void applyExtractAllEltsFromBuildVector (MachineInstr &MI, SmallVectorImpl< std::pair< Register, MachineInstr * > > &MatchInfo) const
LLVM_ABI void applyBuildFn (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Use a function which takes in a MachineIRBuilder to perform a combine.
LLVM_ABI void applyBuildFnNoErase (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Use a function which takes in a MachineIRBuilder to perform a combine.
LLVM_ABI bool matchOrShiftToFunnelShift (MachineInstr &MI, bool AllowScalarConstants, BuildFnTy &MatchInfo) const
LLVM_ABI bool matchFunnelShiftToRotate (MachineInstr &MI) const
 Match an FSHL or FSHR that can be combined to a ROTR or ROTL rotate.
LLVM_ABI void applyFunnelShiftToRotate (MachineInstr &MI) const
LLVM_ABI bool matchRotateOutOfRange (MachineInstr &MI) const
LLVM_ABI void applyRotateOutOfRange (MachineInstr &MI) const
LLVM_ABI bool matchCombineBuildUnmerge (MachineInstr &MI, MachineRegisterInfo &MRI, Register &UnmergeSrc) const
LLVM_ABI void applyCombineBuildUnmerge (MachineInstr &MI, MachineRegisterInfo &MRI, MachineIRBuilder &B, Register &UnmergeSrc) const
LLVM_ABI bool matchUseVectorTruncate (MachineInstr &MI, Register &MatchInfo) const
LLVM_ABI void applyUseVectorTruncate (MachineInstr &MI, Register &MatchInfo) const
LLVM_ABI bool matchICmpToTrueFalseKnownBits (MachineInstr &MI, int64_t &MatchInfo) const
LLVM_ABI bool matchICmpToLHSKnownBits (MachineInstr &MI, BuildFnTy &MatchInfo) const
LLVM_ABI bool matchAndOrDisjointMask (MachineInstr &MI, BuildFnTy &MatchInfo) const
LLVM_ABI bool matchBitfieldExtractFromSExtInReg (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Form a G_SBFX from a G_SEXT_INREG fed by a right shift.
LLVM_ABI bool matchBitfieldExtractFromAnd (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Match: and (lshr x, cst), mask -> ubfx x, cst, width.
LLVM_ABI bool matchBitfieldExtractFromShr (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Match: shr (shl x, n), k -> sbfx/ubfx x, pos, width.
LLVM_ABI bool matchBitfieldExtractFromShrAnd (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Match: shr (and x, n), k -> ubfx x, pos, width.
LLVM_ABI bool matchReassocConstantInnerRHS (GPtrAdd &MI, MachineInstr *RHS, BuildFnTy &MatchInfo) const
LLVM_ABI bool matchReassocFoldConstantsInSubTree (GPtrAdd &MI, MachineInstr *LHS, MachineInstr *RHS, BuildFnTy &MatchInfo) const
LLVM_ABI bool matchReassocConstantInnerLHS (GPtrAdd &MI, MachineInstr *LHS, MachineInstr *RHS, BuildFnTy &MatchInfo) const
LLVM_ABI bool matchReassocPtrAdd (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Reassociate pointer calculations with G_ADD involved, to allow better addressing mode usage.
LLVM_ABI bool tryReassocBinOp (unsigned Opc, Register DstReg, Register Op0, Register Op1, BuildFnTy &MatchInfo) const
 Try to reassociate to reassociate operands of a commutative binop.
LLVM_ABI bool matchReassocCommBinOp (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Reassociate commutative binary operations like G_ADD.
LLVM_ABI bool matchConstantFoldCastOp (MachineInstr &MI, APInt &MatchInfo) const
 Do constant folding when opportunities are exposed after MIR building.
LLVM_ABI bool matchConstantFoldBinOp (MachineInstr &MI, APInt &MatchInfo) const
 Do constant folding when opportunities are exposed after MIR building.
LLVM_ABI bool matchConstantFoldFPBinOp (MachineInstr &MI, ConstantFP *&MatchInfo) const
 Do constant FP folding when opportunities are exposed after MIR building.
LLVM_ABI bool matchConstantFoldFMA (MachineInstr &MI, ConstantFP *&MatchInfo) const
 Constant fold G_FMA/G_FMAD.
LLVM_ABI bool matchNarrowBinopFeedingAnd (MachineInstr &MI, BuildFnTy &MatchInfo) const
LLVM_ABI MachineInstrbuildUDivOrURemUsingMul (MachineInstr &MI) const
 Given an G_UDIV MI or G_UREM MI expressing a divide by constant, return an expression that implements it by multiplying by a magic number.
LLVM_ABI bool matchUDivOrURemByConst (MachineInstr &MI) const
 Combine G_UDIV or G_UREM by constant into a multiply by magic constant.
LLVM_ABI void applyUDivOrURemByConst (MachineInstr &MI) const
LLVM_ABI MachineInstrbuildSDivOrSRemUsingMul (MachineInstr &MI) const
 Given an G_SDIV MI or G_SREM MI expressing a signed divide by constant, return an expression that implements it by multiplying by a magic number.
LLVM_ABI bool matchSDivOrSRemByConst (MachineInstr &MI) const
 Combine G_SDIV or G_SREM by constant into a multiply by magic constant.
LLVM_ABI void applySDivOrSRemByConst (MachineInstr &MI) const
LLVM_ABI bool matchDivByPow2 (MachineInstr &MI, bool IsSigned) const
 Given an G_SDIV MI expressing a signed divided by a pow2 constant, return expressions that implements it by shifting.
LLVM_ABI void applySDivByPow2 (MachineInstr &MI) const
LLVM_ABI void applyUDivByPow2 (MachineInstr &MI) const
 Given an G_UDIV MI expressing an unsigned divided by a pow2 constant, return expressions that implements it by shifting.
LLVM_ABI void applySimplifySRemByPow2 (MachineInstr &MI) const
 Combine G_SREM x, (+/-2^k) to a bias-and-mask sequence.
LLVM_ABI bool matchUMulHToLShr (MachineInstr &MI) const
LLVM_ABI void applyUMulHToLShr (MachineInstr &MI) const
LLVM_ABI bool matchTruncSSatS (MachineInstr &MI, Register &MatchInfo) const
LLVM_ABI void applyTruncSSatS (MachineInstr &MI, Register &MatchInfo) const
LLVM_ABI bool matchTruncSSatU (MachineInstr &MI, Register &MatchInfo) const
LLVM_ABI void applyTruncSSatU (MachineInstr &MI, Register &MatchInfo) const
LLVM_ABI bool matchTruncUSatU (MachineInstr &MI, MachineInstr &MinMI) const
LLVM_ABI bool matchTruncUSatUToFPTOUISat (MachineInstr &MI, MachineInstr &SrcMI) const
LLVM_ABI bool matchMulOBy2 (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Match: (G_UMULO x, 2) -> (G_UADDO x, x) (G_SMULO x, 2) -> (G_SADDO x, x)
LLVM_ABI bool matchMulOBy0 (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Match: (G_*MULO x, 0) -> 0 + no carry out.
LLVM_ABI bool matchAddEToAddO (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Match: (G_*ADDE x, y, 0) -> (G_*ADDO x, y) (G_*SUBE x, y, 0) -> (G_*SUBO x, y)
LLVM_ABI bool matchRedundantNegOperands (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Transform (fadd x, fneg(y)) -> (fsub x, y) (fadd fneg(x), y) -> (fsub y, x) (fsub x, fneg(y)) -> (fadd x, y) (fmul fneg(x), fneg(y)) -> (fmul x, y) (fdiv fneg(x), fneg(y)) -> (fdiv x, y) (fmad fneg(x), fneg(y), z) -> (fmad x, y, z) (fma fneg(x), fneg(y), z) -> (fma x, y, z)
LLVM_ABI bool matchFsubToFneg (MachineInstr &MI, Register &MatchInfo) const
LLVM_ABI void applyFsubToFneg (MachineInstr &MI, Register &MatchInfo) const
LLVM_ABI bool canCombineFMadOrFMA (MachineInstr &MI, bool &AllowFusionGlobally, bool &HasFMAD, bool &Aggressive, bool CanReassociate=false) const
LLVM_ABI bool matchCombineFAddFMulToFMadOrFMA (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Transform (fadd (fmul x, y), z) -> (fma x, y, z) (fadd (fmul x, y), z) -> (fmad x, y, z)
LLVM_ABI bool matchCombineFAddFpExtFMulToFMadOrFMA (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Transform (fadd (fpext (fmul x, y)), z) -> (fma (fpext x), (fpext y), z) (fadd (fpext (fmul x, y)), z) -> (fmad (fpext x), (fpext y), z)
LLVM_ABI bool matchCombineFAddFMAFMulToFMadOrFMA (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Transform (fadd (fma x, y, (fmul u, v)), z) -> (fma x, y, (fma u, v, z)) (fadd (fmad x, y, (fmul u, v)), z) -> (fmad x, y, (fmad u, v, z))
LLVM_ABI bool matchCombineFAddFpExtFMulToFMadOrFMAAggressive (MachineInstr &MI, BuildFnTy &MatchInfo) const
LLVM_ABI bool matchCombineFSubFMulToFMadOrFMA (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Transform (fsub (fmul x, y), z) -> (fma x, y, -z) (fsub (fmul x, y), z) -> (fmad x, y, -z)
LLVM_ABI bool matchCombineFSubFNegFMulToFMadOrFMA (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Transform (fsub (fneg (fmul, x, y)), z) -> (fma (fneg x), y, (fneg z)) (fsub (fneg (fmul, x, y)), z) -> (fmad (fneg x), y, (fneg z))
LLVM_ABI bool matchCombineFSubFpExtFMulToFMadOrFMA (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Transform (fsub (fpext (fmul x, y)), z) -> (fma (fpext x), (fpext y), (fneg z)) (fsub (fpext (fmul x, y)), z) -> (fmad (fpext x), (fpext y), (fneg z))
LLVM_ABI bool matchCombineFSubFpExtFNegFMulToFMadOrFMA (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Transform (fsub (fpext (fneg (fmul x, y))), z) -> (fneg (fma (fpext x), (fpext y), z)) (fsub (fpext (fneg (fmul x, y))), z) -> (fneg (fmad (fpext x), (fpext y), z))
LLVM_ABI bool matchCombineFMinMaxNaN (MachineInstr &MI, unsigned &Info) const
LLVM_ABI bool matchRepeatedFPDivisor (MachineInstr &MI, SmallVector< MachineInstr * > &MatchInfo) const
LLVM_ABI void applyRepeatedFPDivisor (SmallVector< MachineInstr * > &MatchInfo) const
LLVM_ABI bool matchAddSubSameReg (MachineInstr &MI, Register &Src) const
 Transform G_ADD(x, G_SUB(y, x)) to y.
LLVM_ABI bool matchBuildVectorIdentityFold (MachineInstr &MI, Register &MatchInfo) const
LLVM_ABI bool matchTruncBuildVectorFold (MachineInstr &MI, Register &MatchInfo) const
LLVM_ABI bool matchTruncLshrBuildVectorFold (MachineInstr &MI, Register &MatchInfo) const
LLVM_ABI bool matchSubAddSameReg (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Transform: (x + y) - y -> x (x + y) - x -> y x - (y + x) -> 0 - y x - (x + z) -> 0 - z.
LLVM_ABI bool matchSimplifySelectToMinMax (MachineInstr &MI, BuildFnTy &MatchInfo) const
LLVM_ABI bool matchRedundantBinOpInEquality (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Transform: (X + Y) == X -> Y == 0 (X - Y) == X -> Y == 0 (X ^ Y) == X -> Y == 0 (X + Y) != X -> Y != 0 (X - Y) != X -> Y != 0 (X ^ Y) != X -> Y != 0.
LLVM_ABI bool matchShiftsTooBig (MachineInstr &MI, std::optional< int64_t > &MatchInfo) const
 Match shifts greater or equal to the range (the bitwidth of the result datatype, or the effective bitwidth of the source value).
LLVM_ABI bool matchCommuteConstantToRHS (MachineInstr &MI) const
 Match constant LHS ops that should be commuted.
LLVM_ABI bool matchSextOfTrunc (const MachineOperand &MO, BuildFnTy &MatchInfo) const
 Combine sext of trunc.
LLVM_ABI bool matchZextOfTrunc (const MachineOperand &MO, BuildFnTy &MatchInfo) const
 Combine zext of trunc.
LLVM_ABI bool matchNonNegZext (const MachineOperand &MO, BuildFnTy &MatchInfo) const
 Combine zext nneg to sext.
LLVM_ABI bool matchCommuteFPConstantToRHS (MachineInstr &MI) const
 Match constant LHS FP ops that should be commuted.
LLVM_ABI void applyCommuteBinOpOperands (MachineInstr &MI) const
LLVM_ABI bool matchSelectIMinMax (const MachineOperand &MO, BuildFnTy &MatchInfo) const
 Combine select to integer min/max.
LLVM_ABI bool matchSimplifyNegMinMax (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Tranform (neg (min/max x, (neg x))) into (max/min x, (neg x)).
LLVM_ABI bool matchSelect (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Combine selects.
LLVM_ABI bool matchAnd (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Combine ands.
LLVM_ABI bool matchOr (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Combine ors.
LLVM_ABI bool matchNarrowBinop (const MachineInstr &TruncMI, const MachineInstr &BinopMI, BuildFnTy &MatchInfo) const
 trunc (binop X, C) --> binop (trunc X, trunc C).
LLVM_ABI bool matchCastOfInteger (const MachineInstr &CastMI, APInt &MatchInfo) const
LLVM_ABI bool matchAddOverflow (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Combine addos.
LLVM_ABI bool matchExtractVectorElement (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Combine extract vector element.
LLVM_ABI bool matchExtractVectorElementWithBuildVector (const MachineInstr &MI, const MachineInstr &MI2, BuildFnTy &MatchInfo) const
 Combine extract vector element with a build vector on the vector register.
LLVM_ABI bool matchExtractVectorElementWithBuildVectorTrunc (const MachineOperand &MO, BuildFnTy &MatchInfo) const
 Combine extract vector element with a build vector trunc on the vector register.
LLVM_ABI bool matchExtractVectorElementWithShuffleVector (const MachineInstr &MI, const MachineInstr &MI2, BuildFnTy &MatchInfo) const
 Combine extract vector element with a shuffle vector on the vector register.
LLVM_ABI bool matchExtractVectorElementWithDifferentIndices (const MachineOperand &MO, BuildFnTy &MatchInfo) const
 Combine extract vector element with a insert vector element on the vector register and different indices.
LLVM_ABI bool matchShuffleUndefRHS (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Remove references to rhs if it is undef.
LLVM_ABI bool matchShuffleDisjointMask (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Turn shuffle a, b, mask -> shuffle undef, b, mask iff mask does not reference a.
LLVM_ABI void applyBuildFnMO (const MachineOperand &MO, BuildFnTy &MatchInfo) const
 Use a function which takes in a MachineIRBuilder to perform a combine.
LLVM_ABI bool matchFPowIExpansion (MachineInstr &MI, int64_t Exponent) const
 Match FPOWI if it's safe to extend it into a series of multiplications.
LLVM_ABI void applyExpandFPowI (MachineInstr &MI, int64_t Exponent) const
 Expands FPOWI into a series of multiplications and a division if the exponent is negative.
LLVM_ABI bool matchInsertVectorElementOOB (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Combine insert vector element OOB.
LLVM_ABI bool matchFreezeOfSingleMaybePoisonOperand (MachineInstr &MI, BuildFnTy &MatchInfo) const
LLVM_ABI bool matchAddOfVScale (const MachineOperand &MO, BuildFnTy &MatchInfo) const
LLVM_ABI bool matchMulOfVScale (const MachineOperand &MO, BuildFnTy &MatchInfo) const
LLVM_ABI bool matchSubOfVScale (const MachineOperand &MO, BuildFnTy &MatchInfo) const
LLVM_ABI bool matchShlOfVScale (const MachineOperand &MO, BuildFnTy &MatchInfo) const
LLVM_ABI bool matchTruncateOfExt (const MachineInstr &Root, const MachineInstr &ExtMI, BuildFnTy &MatchInfo) const
 Transform trunc ([asz]ext x) to x or ([asz]ext x) or (trunc x).
LLVM_ABI bool matchCastOfSelect (const MachineInstr &Cast, const MachineInstr &SelectMI, BuildFnTy &MatchInfo) const
LLVM_ABI bool matchFoldAPlusC1MinusC2 (const MachineInstr &MI, BuildFnTy &MatchInfo) const
LLVM_ABI bool matchFoldC2MinusAPlusC1 (const MachineInstr &MI, BuildFnTy &MatchInfo) const
LLVM_ABI bool matchFoldAMinusC1MinusC2 (const MachineInstr &MI, BuildFnTy &MatchInfo) const
LLVM_ABI bool matchFoldC1Minus2MinusC2 (const MachineInstr &MI, BuildFnTy &MatchInfo) const
LLVM_ABI bool matchFoldAMinusC1PlusC2 (const MachineInstr &MI, BuildFnTy &MatchInfo) const
LLVM_ABI bool matchExtOfExt (const MachineInstr &FirstMI, const MachineInstr &SecondMI, BuildFnTy &MatchInfo) const
LLVM_ABI bool matchCastOfBuildVector (const MachineInstr &CastMI, const MachineInstr &BVMI, BuildFnTy &MatchInfo) const
LLVM_ABI bool matchCanonicalizeICmp (const MachineInstr &MI, BuildFnTy &MatchInfo) const
LLVM_ABI bool matchCanonicalizeFCmp (const MachineInstr &MI, BuildFnTy &MatchInfo) const
LLVM_ABI bool matchUnmergeValuesAnyExtBuildVector (const MachineInstr &MI, BuildFnTy &MatchInfo) const
LLVM_ABI bool matchMergeXAndUndef (const MachineInstr &MI, BuildFnTy &MatchInfo) const
LLVM_ABI bool matchMergeXAndZero (const MachineInstr &MI, BuildFnTy &MatchInfo) const
LLVM_ABI bool matchSuboCarryOut (const MachineInstr &MI, BuildFnTy &MatchInfo) const
LLVM_ABI bool matchRedundantSextInReg (MachineInstr &Root, MachineInstr &Other, BuildFnTy &MatchInfo) const
LLVM_ABI bool matchCtls (MachineInstr &CtlzMI, BuildFnTy &MatchInfo) const
LLVM_ABI bool matchAVG (MachineInstr &MI, MachineRegisterInfo &MRI, Register X, Register Y, unsigned TargetOpc) const
LLVM_ABI bool matchCountZeroToZeroPoison (MachineInstr &MI) const
LLVM_ABI void applyCountZeroToZeroPoison (MachineInstr &MI) const

Protected Attributes

MachineIRBuilderBuilder
MachineRegisterInfoMRI
GISelChangeObserverObserver
GISelValueTrackingVT
MachineDominatorTreeMDT
bool IsPreLegalize
const LegalizerInfoLI
const TargetInstrInfoTII
const RegisterBankInfoRBI
const TargetRegisterInfoTRI

Detailed Description

Definition at line 115 of file CombinerHelper.h.

Constructor & Destructor Documentation

◆ CombinerHelper()

CombinerHelper::CombinerHelper ( GISelChangeObserver & Observer,
MachineIRBuilder & B,
bool IsPreLegalize,
GISelValueTracking * VT = nullptr,
MachineDominatorTree * MDT = nullptr,
const LegalizerInfo * LI = nullptr )

Definition at line 57 of file CombinerHelper.cpp.

References B(), Builder, IsPreLegalize, LI, MDT, MRI, Observer, RBI, TII, TRI, and VT.

Member Function Documentation

◆ applyAshShlToSextInreg()

void CombinerHelper::applyAshShlToSextInreg ( MachineInstr & MI,
std::tuple< Register, int64_t > & MatchInfo ) const

Definition at line 3417 of file CombinerHelper.cpp.

References assert(), Builder, MI, MRI, and Size.

◆ applyBuildFn()

void CombinerHelper::applyBuildFn ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

Use a function which takes in a MachineIRBuilder to perform a combine.

By default, it erases the instruction MI from the function.

Definition at line 4610 of file CombinerHelper.cpp.

References applyBuildFnNoErase(), and MI.

◆ applyBuildFnMO()

void CombinerHelper::applyBuildFnMO ( const MachineOperand & MO,
BuildFnTy & MatchInfo ) const

Use a function which takes in a MachineIRBuilder to perform a combine.

By default, it erases the instruction def'd on MO from the function.

Definition at line 8326 of file CombinerHelper.cpp.

References Builder, llvm::MachineInstr::eraseFromParent(), llvm::getDefIgnoringCopies(), llvm::MachineOperand::getReg(), and MRI.

◆ applyBuildFnNoErase()

void CombinerHelper::applyBuildFnNoErase ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

Use a function which takes in a MachineIRBuilder to perform a combine.

This variant does not erase MI after calling the build function.

Definition at line 4617 of file CombinerHelper.cpp.

References Builder, and MI.

Referenced by applyBuildFn().

◆ applyBuildInstructionSteps()

void CombinerHelper::applyBuildInstructionSteps ( MachineInstr & MI,
InstructionStepsMatchInfo & MatchInfo ) const

Replace MI with a series of instructions described in MatchInfo.

Definition at line 3382 of file CombinerHelper.cpp.

References assert(), Builder, llvm::InstructionStepsMatchInfo::InstrsToBuild, and MI.

◆ applyCombineAddP2IToPtrAdd()

void CombinerHelper::applyCombineAddP2IToPtrAdd ( MachineInstr & MI,
std::pair< Register, bool > & PtrRegAndCommute ) const

Definition at line 2651 of file CombinerHelper.cpp.

References Builder, MI, MRI, and std::swap().

◆ applyCombineBuildUnmerge()

void CombinerHelper::applyCombineBuildUnmerge ( MachineInstr & MI,
MachineRegisterInfo & MRI,
MachineIRBuilder & B,
Register & UnmergeSrc ) const

Definition at line 3641 of file CombinerHelper.cpp.

References assert(), B(), MI, and MRI.

◆ applyCombineBuildVectorOfBitcast()

void CombinerHelper::applyCombineBuildVectorOfBitcast ( MachineInstr & MI,
SmallVector< Register > & Ops ) const

◆ applyCombineConcatVectors()

void CombinerHelper::applyCombineConcatVectors ( MachineInstr & MI,
SmallVector< Register > & Ops ) const

Replace MI with a flattened build_vector with Ops or an implicit_def if Ops is empty.

Definition at line 389 of file CombinerHelper.cpp.

References AbstractManglingParser< Derived, Alloc >::Ops, Builder, MI, MRI, and replaceRegWith().

◆ applyCombineConstantFoldFpUnary()

void CombinerHelper::applyCombineConstantFoldFpUnary ( MachineInstr & MI,
const ConstantFP * Cst ) const

Transform fp_instr(cst) to constant result of the fp operation.

Definition at line 1822 of file CombinerHelper.cpp.

References Builder, constantFoldFpUnary(), llvm::ConstantFP::getValue(), MI, and MRI.

◆ applyCombineConstPtrAddToI2P()

void CombinerHelper::applyCombineConstPtrAddToI2P ( MachineInstr & MI,
APInt & NewCst ) const

Definition at line 2690 of file CombinerHelper.cpp.

References Builder, llvm::cast(), and MI.

◆ applyCombineCopy()

void CombinerHelper::applyCombineCopy ( MachineInstr & MI) const

Definition at line 245 of file CombinerHelper.cpp.

References MI, MRI, and replaceRegWith().

Referenced by tryCombineCopy().

◆ applyCombineDivRem()

void CombinerHelper::applyCombineDivRem ( MachineInstr & MI,
MachineInstr *& OtherMI ) const

◆ applyCombineExtendingLoads()

◆ applyCombineIndexedLoadStore()

◆ applyCombineInsertVecElts()

void CombinerHelper::applyCombineInsertVecElts ( MachineInstr & MI,
SmallVectorImpl< Register > & MatchInfo ) const

Definition at line 3178 of file CombinerHelper.cpp.

References Builder, llvm::LLT::getScalarType(), MI, and MRI.

◆ applyCombineMemCpyFamily()

void CombinerHelper::applyCombineMemCpyFamily ( MachineInstr & MI,
MemCpyFamilyLoweringInfo & MatchInfo ) const

◆ applyCombineMulToShl()

◆ applyCombineP2IToI2P()

void CombinerHelper::applyCombineP2IToI2P ( MachineInstr & MI,
Register & Reg ) const

Transform PtrToInt(IntToPtr(x)) to x.

Definition at line 2618 of file CombinerHelper.cpp.

References assert(), Builder, and MI.

◆ applyCombineShiftToUnmerge()

void CombinerHelper::applyCombineShiftToUnmerge ( MachineInstr & MI,
const unsigned & ShiftVal ) const

◆ applyCombineShlOfExtend()

void CombinerHelper::applyCombineShlOfExtend ( MachineInstr & MI,
const RegisterImmPair & MatchData ) const

◆ applyCombineShuffleConcat()

void CombinerHelper::applyCombineShuffleConcat ( MachineInstr & MI,
SmallVector< Register > & Ops ) const

Replace MI with a flattened build_vector with Ops or an implicit_def if Ops is empty.

Definition at line 562 of file CombinerHelper.cpp.

References AbstractManglingParser< Derived, Alloc >::Ops, assert(), Builder, MI, and MRI.

◆ applyCombineShuffleToBuildVector()

void CombinerHelper::applyCombineShuffleToBuildVector ( MachineInstr & MI) const

◆ applyCombineShuffleVector()

void CombinerHelper::applyCombineShuffleVector ( MachineInstr & MI,
ArrayRef< Register > Ops ) const

Replace MI with a concat_vectors with Ops.

Definition at line 662 of file CombinerHelper.cpp.

References AbstractManglingParser< Derived, Alloc >::Ops, Builder, MI, MRI, and replaceRegWith().

◆ applyCombineTruncOfShift()

void CombinerHelper::applyCombineTruncOfShift ( MachineInstr & MI,
std::pair< MachineInstr *, LLT > & MatchInfo ) const

◆ applyCombineUnmergeConstant()

void CombinerHelper::applyCombineUnmergeConstant ( MachineInstr & MI,
SmallVectorImpl< APInt > & Csts ) const

◆ applyCombineUnmergeMergeToPlainValues()

void CombinerHelper::applyCombineUnmergeMergeToPlainValues ( MachineInstr & MI,
SmallVectorImpl< Register > & Operands ) const

Definition at line 2351 of file CombinerHelper.cpp.

References assert(), Builder, MI, MRI, Operands, and replaceRegWith().

◆ applyCombineUnmergeWithDeadLanesToTrunc()

void CombinerHelper::applyCombineUnmergeWithDeadLanesToTrunc ( MachineInstr & MI) const

Definition at line 2447 of file CombinerHelper.cpp.

References Builder, and MI.

◆ applyCombineUnmergeZExtToZExt()

void CombinerHelper::applyCombineUnmergeZExtToZExt ( MachineInstr & MI) const

◆ applyCommuteBinOpOperands()

void CombinerHelper::applyCommuteBinOpOperands ( MachineInstr & MI) const

Definition at line 7430 of file CombinerHelper.cpp.

References MI, and Observer.

◆ applyCountZeroToZeroPoison()

void CombinerHelper::applyCountZeroToZeroPoison ( MachineInstr & MI) const

Definition at line 8865 of file CombinerHelper.cpp.

References getCountZeroPoisonOpcode(), MI, and replaceOpcodeWith().

◆ applyExpandFPowI()

void CombinerHelper::applyExpandFPowI ( MachineInstr & MI,
int64_t Exponent ) const

Expands FPOWI into a series of multiplications and a division if the exponent is negative.

Definition at line 8339 of file CombinerHelper.cpp.

References llvm::sampleprof::Base, Builder, llvm::Exponent, MI, and MRI.

◆ applyExtendThroughPhis()

◆ applyExtractAllEltsFromBuildVector()

void CombinerHelper::applyExtractAllEltsFromBuildVector ( MachineInstr & MI,
SmallVectorImpl< std::pair< Register, MachineInstr * > > & MatchInfo ) const

Definition at line 4598 of file CombinerHelper.cpp.

References assert(), MI, MRI, and replaceRegWith().

◆ applyExtractVecEltBuildVec()

void CombinerHelper::applyExtractVecEltBuildVec ( MachineInstr & MI,
Register & Reg ) const

◆ applyFoldBinOpIntoSelect()

void CombinerHelper::applyFoldBinOpIntoSelect ( MachineInstr & MI,
const unsigned & SelectOpNo ) const

SelectOperand is the operand in binary operator MI that is the select to fold.

Definition at line 4015 of file CombinerHelper.cpp.

References Builder, llvm::cast(), getReg(), MI, MRI, and Select.

◆ applyFsubToFneg()

void CombinerHelper::applyFsubToFneg ( MachineInstr & MI,
Register & MatchInfo ) const

Definition at line 6371 of file CombinerHelper.cpp.

References Builder, eraseInst(), MI, and MRI.

◆ applyFunnelShiftConstantModulo()

void CombinerHelper::applyFunnelShiftConstantModulo ( MachineInstr & MI) const

Replaces the shift amount in MI with ShiftAmt % BW.

Parameters
MI

Definition at line 3041 of file CombinerHelper.cpp.

References assert(), Builder, llvm::getIConstantVRegValWithLookThrough(), llvm::LLT::getScalarSizeInBits(), llvm::LLT::getSizeInBits(), llvm::APInt::getZExtValue(), MI, MRI, and llvm::APInt::urem().

◆ applyFunnelShiftToRotate()

void CombinerHelper::applyFunnelShiftToRotate ( MachineInstr & MI) const

Definition at line 4688 of file CombinerHelper.cpp.

References assert(), Builder, MI, Observer, and Opc.

◆ applyLshrOfTruncOfLshr()

◆ applyNotCmp()

◆ applyOptBrCondByInvertingCond()

◆ applyPtrAddImmedChain()

void CombinerHelper::applyPtrAddImmedChain ( MachineInstr & MI,
PtrAddChain & MatchInfo ) const

◆ applyRepeatedFPDivisor()

void CombinerHelper::applyRepeatedFPDivisor ( SmallVector< MachineInstr * > & MatchInfo) const

Definition at line 7062 of file CombinerHelper.cpp.

References Builder, getParent(), getReg(), MI, and MRI.

◆ applyRotateOutOfRange()

void CombinerHelper::applyRotateOutOfRange ( MachineInstr & MI) const

Definition at line 4715 of file CombinerHelper.cpp.

References assert(), Builder, MI, MRI, and Observer.

◆ applySDivByPow2()

◆ applySDivOrSRemByConst()

void CombinerHelper::applySDivOrSRemByConst ( MachineInstr & MI) const

Definition at line 5897 of file CombinerHelper.cpp.

References buildSDivOrSRemUsingMul(), MI, and replaceSingleDefInstWithReg().

◆ applySextInRegOfLoad()

void CombinerHelper::applySextInRegOfLoad ( MachineInstr & MI,
std::tuple< Register, unsigned > & MatchInfo ) const

◆ applyShiftImmedChain()

void CombinerHelper::applyShiftImmedChain ( MachineInstr & MI,
RegisterImmPair & MatchInfo ) const

◆ applyShiftOfShiftedLogic()

◆ applySimplifyAddToSub()

void CombinerHelper::applySimplifyAddToSub ( MachineInstr & MI,
std::tuple< Register, Register > & MatchInfo ) const

Definition at line 3196 of file CombinerHelper.cpp.

References Builder, and MI.

◆ applySimplifySRemByPow2()

void CombinerHelper::applySimplifySRemByPow2 ( MachineInstr & MI) const

Combine G_SREM x, (+/-2^k) to a bias-and-mask sequence.

Definition at line 6135 of file CombinerHelper.cpp.

References assert(), llvm::BitWidth, Builder, llvm::cast(), llvm::TargetLoweringBase::getPreferredShiftAmountTy(), getTargetLowering(), llvm::Masked, MI, and MRI.

◆ applySimplifyURemByPow2()

void CombinerHelper::applySimplifyURemByPow2 ( MachineInstr & MI) const

Combine G_UREM x, (known power of 2) to an add and bitmasking.

The second source operand is known to be a power of 2.

Definition at line 3942 of file CombinerHelper.cpp.

References llvm::Add, Builder, MI, and MRI.

◆ applyTruncSSatS()

void CombinerHelper::applyTruncSSatS ( MachineInstr & MI,
Register & MatchInfo ) const

Definition at line 6245 of file CombinerHelper.cpp.

References Builder, and MI.

◆ applyTruncSSatU()

void CombinerHelper::applyTruncSSatU ( MachineInstr & MI,
Register & MatchInfo ) const

Definition at line 6278 of file CombinerHelper.cpp.

References Builder, and MI.

◆ applyUDivByPow2()

void CombinerHelper::applyUDivByPow2 ( MachineInstr & MI) const

Given an G_UDIV MI expressing an unsigned divided by a pow2 constant, return expressions that implements it by shifting.

Definition at line 6121 of file CombinerHelper.cpp.

References assert(), Builder, llvm::cast(), llvm::TargetLoweringBase::getPreferredShiftAmountTy(), getTargetLowering(), MI, and MRI.

◆ applyUDivOrURemByConst()

void CombinerHelper::applyUDivOrURemByConst ( MachineInstr & MI) const

Definition at line 5842 of file CombinerHelper.cpp.

References buildUDivOrURemUsingMul(), MI, and replaceSingleDefInstWithReg().

◆ applyUMulHToLShr()

void CombinerHelper::applyUMulHToLShr ( MachineInstr & MI) const

◆ applyUseVectorTruncate()

◆ applyXorOfAndWithSameReg()

void CombinerHelper::applyXorOfAndWithSameReg ( MachineInstr & MI,
std::pair< Register, Register > & MatchInfo ) const

Definition at line 3907 of file CombinerHelper.cpp.

References Builder, MI, MRI, Observer, X, and Y.

◆ buildSDivOrSRemUsingMul()

◆ buildUDivOrURemUsingMul()

◆ canCombineFMadOrFMA()

◆ dominates()

bool CombinerHelper::dominates ( const MachineInstr & DefMI,
const MachineInstr & UseMI ) const

Returns true if DefMI dominates UseMI.

By definition an instruction dominates itself.

If we haven't been provided with a MachineDominatorTree during construction, this function returns a conservative result that tracks just a single basic block.

Definition at line 1075 of file CombinerHelper.cpp.

References assert(), DefMI, isPredecessor(), MDT, and UseMI.

Referenced by applyCombineDivRem(), and matchRepeatedFPDivisor().

◆ eraseInst()

void CombinerHelper::eraseInst ( MachineInstr & MI) const

Erase MI.

Definition at line 2889 of file CombinerHelper.cpp.

References MI.

Referenced by applyCombineTruncOfShift(), and applyFsubToFneg().

◆ getBuilder()

MachineIRBuilder & llvm::CombinerHelper::getBuilder ( ) const
inline

Definition at line 136 of file CombinerHelper.h.

References Builder.

◆ getContext()

LLVMContext & CombinerHelper::getContext ( ) const

Definition at line 82 of file CombinerHelper.cpp.

References Builder.

◆ getDataLayout()

const DataLayout & CombinerHelper::getDataLayout ( ) const

◆ getMachineFunction()

const MachineFunction & CombinerHelper::getMachineFunction ( ) const

Definition at line 74 of file CombinerHelper.cpp.

References Builder.

Referenced by getDataLayout().

◆ getRBI()

const RegisterBankInfo & llvm::CombinerHelper::getRBI ( ) const
inline

Definition at line 144 of file CombinerHelper.h.

References RBI.

◆ getRegBank()

const RegisterBank * CombinerHelper::getRegBank ( Register Reg) const

Get the register bank of Reg.

If Reg has not been assigned a register, a register class, or a register bank, then this returns nullptr.

Precondition
Reg.isValid()

Definition at line 221 of file CombinerHelper.cpp.

References MRI, RBI, and TRI.

Referenced by matchPtrAddImmedChain().

◆ getTargetLowering()

◆ getTII()

const TargetInstrInfo & llvm::CombinerHelper::getTII ( ) const
inline

Definition at line 140 of file CombinerHelper.h.

References TII.

◆ getTRI()

const TargetRegisterInfo & llvm::CombinerHelper::getTRI ( ) const
inline

Definition at line 142 of file CombinerHelper.h.

References TRI.

◆ getValueTracking()

GISelValueTracking * llvm::CombinerHelper::getValueTracking ( ) const
inline

Definition at line 134 of file CombinerHelper.h.

References VT.

◆ isConstantLegalOrBeforeLegalizer()

bool CombinerHelper::isConstantLegalOrBeforeLegalizer ( const LLT Ty) const
Returns
true if the combine is running prior to legalization, or if Ty is a legal integer constant type on the target.

Definition at line 178 of file CombinerHelper.cpp.

References llvm::LLT::getElementType(), isLegal(), isLegalOrBeforeLegalizer(), and isPreLegalize().

Referenced by matchAddOverflow(), matchCastOfInteger(), matchCombineSubToAdd(), matchExtractVectorElementWithShuffleVector(), matchMulOBy0(), and matchSuboCarryOut().

◆ isDesirableToCommuteWithShift()

bool CombinerHelper::isDesirableToCommuteWithShift ( const MachineInstr & MI) const
Returns
true if the target's TargetLowering::isDesirableToCommuteWithShift hook approves of commuting MI (a G_SHL) with the binop feeding it.

Definition at line 2126 of file CombinerHelper.cpp.

References getTargetLowering(), llvm::TargetLowering::isDesirableToCommuteWithShift(), isPreLegalize(), and MI.

◆ isLegal()

◆ isLegalOrBeforeLegalizer()

bool CombinerHelper::isLegalOrBeforeLegalizer ( const LegalityQuery & Query) const
Returns
true if the combine is running prior to legalization, or if Query is legal on the target.

Definition at line 161 of file CombinerHelper.cpp.

References isLegal(), and isPreLegalize().

Referenced by canCombineFMadOrFMA(), isConstantLegalOrBeforeLegalizer(), matchAddOverflow(), matchAshrShlToSextInreg(), matchCastOfBuildVector(), matchCastOfSelect(), matchCombineConcatVectors(), matchCombineDivRem(), matchCombineExtractedVectorLoad(), matchCombineLoadWithAndMask(), matchCombineShlOfExtend(), matchCombineShuffleConcat(), matchCombineSubToAdd(), matchCombineTruncOfShift(), matchCountZeroToZeroPoison(), matchExtOfExt(), matchExtractVectorElement(), matchExtractVectorElementWithBuildVectorTrunc(), matchExtractVectorElementWithShuffleVector(), llvm::AMDGPUCombinerHelper::matchFoldFAbsFptrunc(), matchFreezeOfSingleMaybePoisonOperand(), matchFunnelShiftToRotate(), matchHoistLogicOpWithSameOpcodeHands(), matchICmpToLHSKnownBits(), matchInsertVectorElementOOB(), matchLoadOrCombine(), matchMergeXAndUndef(), matchMergeXAndZero(), matchNarrowBinop(), matchNarrowBinopFeedingAnd(), matchNonNegZext(), matchOrShiftToFunnelShift(), matchRedundantNegOperands(), matchSDivOrSRemByConst(), matchSelectIMinMax(), matchSextInRegOfLoad(), matchSextOfTrunc(), matchShlOfVScale(), matchShuffleDisjointMask(), matchSuboCarryOut(), matchSubOfVScale(), matchTruncateOfExt(), matchTruncUSatUToFPTOUISat(), matchUDivOrURemByConst(), matchUMulHToLShr(), matchUnmergeValuesAnyExtBuildVector(), and matchZextOfTrunc().

◆ isLegalOrHasFewerElements()

bool CombinerHelper::isLegalOrHasFewerElements ( const LegalityQuery & Query) const
Returns
true if Query is legal on the target, or if Query will perform a FewerElements action on the target.

Definition at line 171 of file CombinerHelper.cpp.

References llvm::LegalizeActions::FewerElements, llvm::LegalizeActions::Legal, and LI.

Referenced by matchTruncSSatS(), matchTruncSSatU(), and matchTruncUSatU().

◆ isLegalOrHasWidenScalar()

bool CombinerHelper::isLegalOrHasWidenScalar ( const LegalityQuery & Query) const
Returns
true if Query is legal on the target, or if Query will perform WidenScalar action on the target.

Definition at line 166 of file CombinerHelper.cpp.

References isLegal(), LI, and llvm::LegalizeActions::WidenScalar.

Referenced by matchSDivOrSRemByConst().

◆ isPredecessor()

bool CombinerHelper::isPredecessor ( const MachineInstr & DefMI,
const MachineInstr & UseMI ) const

Returns true if DefMI precedes UseMI or they are the same instruction.

Both must be in the same basic block.

Definition at line 1059 of file CombinerHelper.cpp.

References assert(), DefMI, llvm::find_if(), llvm_unreachable, MBB, MI, and UseMI.

Referenced by dominates().

◆ isPreLegalize()

bool CombinerHelper::isPreLegalize ( ) const
Returns
true if the combiner is running pre-legalization.

Definition at line 154 of file CombinerHelper.cpp.

References IsPreLegalize.

Referenced by canCombineFMadOrFMA(), isConstantLegalOrBeforeLegalizer(), isDesirableToCommuteWithShift(), isLegalOrBeforeLegalizer(), and matchCombineExtendingLoads().

◆ matchAddEToAddO()

bool CombinerHelper::matchAddEToAddO ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

Match: (G_*ADDE x, y, 0) -> (G_*ADDO x, y) (G_*SUBE x, y, 0) -> (G_*SUBO x, y)

Definition at line 5544 of file CombinerHelper.cpp.

References assert(), B(), llvm::MIPatternMatch::m_SpecificICstOrSplat(), MI, llvm::MIPatternMatch::mi_match(), MRI, and Observer.

◆ matchAddOfVScale()

◆ matchAddOverflow()

◆ matchAddSubSameReg()

bool CombinerHelper::matchAddSubSameReg ( MachineInstr & MI,
Register & Src ) const

Transform G_ADD(x, G_SUB(y, x)) to y.

Transform G_ADD(G_SUB(y, x), x) to y.

Definition at line 7081 of file CombinerHelper.cpp.

References assert(), llvm::MIPatternMatch::m_GSub(), llvm::MIPatternMatch::m_Reg(), MI, llvm::MIPatternMatch::mi_match(), and MRI.

◆ matchAllExplicitUsesAreUndef()

bool CombinerHelper::matchAllExplicitUsesAreUndef ( MachineInstr & MI) const

Return true if all register explicit use operands on MI are defined by a G_IMPLICIT_DEF.

Definition at line 2837 of file CombinerHelper.cpp.

References llvm::all_of(), and MI.

◆ matchAnd()

bool CombinerHelper::matchAnd ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

Combine ands.

Definition at line 8134 of file CombinerHelper.cpp.

References llvm::cast(), and MI.

◆ matchAndOrDisjointMask()

bool CombinerHelper::matchAndOrDisjointMask ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

◆ matchAshrShlToSextInreg()

bool CombinerHelper::matchAshrShlToSextInreg ( MachineInstr & MI,
std::tuple< Register, int64_t > & MatchInfo ) const

◆ matchAVG()

bool CombinerHelper::matchAVG ( MachineInstr & MI,
MachineRegisterInfo & MRI,
Register X,
Register Y,
unsigned TargetOpc ) const

Definition at line 8826 of file CombinerHelper.cpp.

References assert(), isLegal(), MI, MRI, X, and Y.

◆ matchBinOpSameVal()

LLVM_ABI bool llvm::CombinerHelper::matchBinOpSameVal ( MachineInstr & MI) const

Optimize (x op x) -> x.

References llvm::Aggressive, B(), llvm::sampleprof::Base, llvm::Exponent, LHS, LLVM_ABI, MI, MRI, llvm::Offset, Opc, llvm::Other, Reg, RHS, X, and Y.

◆ matchBinopWithNeg()

bool CombinerHelper::matchBinopWithNeg ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

Fold a bitwiseop (~b +/- c) -> a bitwiseop ~(b -/+ c)

Definition at line 3256 of file CombinerHelper.cpp.

References MI, and MRI.

◆ matchBitfieldExtractFromAnd()

bool CombinerHelper::matchBitfieldExtractFromAnd ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

Match: and (lshr x, cst), mask -> ubfx x, cst, width.

Form a G_UBFX from "(a srl b) & mask", where b and mask are constants.

Definition at line 4883 of file CombinerHelper.cpp.

References llvm::cast(), llvm::TargetLoweringBase::getPreferredShiftAmountTy(), getTargetLowering(), LI, MI, and MRI.

◆ matchBitfieldExtractFromSExtInReg()

bool CombinerHelper::matchBitfieldExtractFromSExtInReg ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

Form a G_SBFX from a G_SEXT_INREG fed by a right shift.

Definition at line 4853 of file CombinerHelper.cpp.

References assert(), llvm::TargetLoweringBase::getPreferredShiftAmountTy(), getTargetLowering(), LI, MI, and MRI.

◆ matchBitfieldExtractFromShr()

bool CombinerHelper::matchBitfieldExtractFromShr ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

Match: shr (shl x, n), k -> sbfx/ubfx x, pos, width.

Definition at line 4932 of file CombinerHelper.cpp.

References assert(), llvm::TargetLoweringBase::getPreferredShiftAmountTy(), getTargetLowering(), LI, MI, and MRI.

◆ matchBitfieldExtractFromShrAnd()

bool CombinerHelper::matchBitfieldExtractFromShrAnd ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

Match: shr (and x, n), k -> ubfx x, pos, width.

Definition at line 4982 of file CombinerHelper.cpp.

References assert(), llvm::TargetLoweringBase::getPreferredShiftAmountTy(), getTargetLowering(), LI, MI, and MRI.

◆ matchBuildVectorIdentityFold()

◆ matchCanonicalizeFCmp()

bool CombinerHelper::matchCanonicalizeFCmp ( const MachineInstr & MI,
BuildFnTy & MatchInfo ) const

◆ matchCanonicalizeICmp()

bool CombinerHelper::matchCanonicalizeICmp ( const MachineInstr & MI,
BuildFnTy & MatchInfo ) const

◆ matchCastOfBuildVector()

◆ matchCastOfInteger()

◆ matchCastOfSelect()

bool CombinerHelper::matchCastOfSelect ( const MachineInstr & Cast,
const MachineInstr & SelectMI,
BuildFnTy & MatchInfo ) const

◆ matchCombineAddP2IToPtrAdd()

bool CombinerHelper::matchCombineAddP2IToPtrAdd ( MachineInstr & MI,
std::pair< Register, bool > & PtrRegAndCommute ) const

Transform G_ADD (G_PTRTOINT x), y -> G_PTRTOINT (G_PTR_ADD x, y) Transform G_ADD y, (G_PTRTOINT x) -> G_PTRTOINT (G_PTR_ADD x, y)

Definition at line 2626 of file CombinerHelper.cpp.

References assert(), llvm::LLT::getScalarSizeInBits(), llvm::MIPatternMatch::m_GPtrToInt(), llvm::MIPatternMatch::m_Reg(), MI, llvm::MIPatternMatch::mi_match(), and MRI.

◆ matchCombineAnyExtTrunc()

◆ matchCombineBuildUnmerge()

bool CombinerHelper::matchCombineBuildUnmerge ( MachineInstr & MI,
MachineRegisterInfo & MRI,
Register & UnmergeSrc ) const

◆ matchCombineBuildVectorOfBitcast()

◆ matchCombineConcatVectors()

bool CombinerHelper::matchCombineConcatVectors ( MachineInstr & MI,
SmallVector< Register > & Ops ) const

If MI is G_CONCAT_VECTORS, try to combine it.

Returns true if MI changed. Right now, we support:

  • concat_vector(undef, undef) => undef
  • concat_vector(build_vector(A, B), build_vector(C, D)) =>

build_vector(A, B, C, D)

Check if the G_CONCAT_VECTORS MI is undef or if it can be flattened into a build_vector. In the first case Ops will be empty In the second case Ops will contain the operands needed to produce the flattened build_vector.

Precondition
MI.getOpcode() == G_CONCAT_VECTORS.

Definition at line 330 of file CombinerHelper.cpp.

References AbstractManglingParser< Derived, Alloc >::Ops, assert(), Builder, isLegalOrBeforeLegalizer(), llvm::MIPatternMatch::m_MInstr(), MI, llvm::MIPatternMatch::mi_match(), MRI, and llvm::Undef.

◆ matchCombineConstPtrAddToI2P()

◆ matchCombineCopy()

bool CombinerHelper::matchCombineCopy ( MachineInstr & MI) const

Definition at line 238 of file CombinerHelper.cpp.

References llvm::canReplaceReg(), MI, and MRI.

Referenced by tryCombineCopy().

◆ matchCombineDivRem()

bool CombinerHelper::matchCombineDivRem ( MachineInstr & MI,
MachineInstr *& OtherMI ) const

Try to combine G_[SU]DIV and G_[SU]REM into a single G_[SU]DIVREM when their source operands are identical.

Definition at line 1572 of file CombinerHelper.cpp.

References isLegalOrBeforeLegalizer(), llvm_unreachable, matchEqualDefs(), MI, MRI, and UseMI.

◆ matchCombineExtendingLoads()

◆ matchCombineExtractedVectorLoad()

◆ matchCombineFAddFMAFMulToFMadOrFMA()

bool CombinerHelper::matchCombineFAddFMAFMulToFMadOrFMA ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

Transform (fadd (fma x, y, (fmul u, v)), z) -> (fma x, y, (fma u, v, z)) (fadd (fmad x, y, (fmul u, v)), z) -> (fmad x, y, (fmad u, v, z))

Definition at line 6542 of file CombinerHelper.cpp.

References llvm::Aggressive, assert(), B(), canCombineFMadOrFMA(), llvm::MachineInstr::getFlags(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), llvm::MIPatternMatch::m_GFMul(), llvm::MIPatternMatch::m_MInstr(), llvm::MIPatternMatch::m_Reg(), MI, llvm::MIPatternMatch::mi_match(), MRI, X, and Y.

◆ matchCombineFAddFMulToFMadOrFMA()

bool CombinerHelper::matchCombineFAddFMulToFMadOrFMA ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

Transform (fadd (fmul x, y), z) -> (fma x, y, z) (fadd (fmul x, y), z) -> (fmad x, y, z)

Definition at line 6426 of file CombinerHelper.cpp.

References llvm::Aggressive, assert(), B(), canCombineFMadOrFMA(), hasMoreUses(), isContractableFMul(), llvm::MIPatternMatch::m_MInstr(), MI, llvm::MIPatternMatch::mi_match(), MRI, and std::swap().

◆ matchCombineFAddFpExtFMulToFMadOrFMA()

bool CombinerHelper::matchCombineFAddFpExtFMulToFMadOrFMA ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

Transform (fadd (fpext (fmul x, y)), z) -> (fma (fpext x), (fpext y), z) (fadd (fpext (fmul x, y)), z) -> (fmad (fpext x), (fpext y), z)

Definition at line 6483 of file CombinerHelper.cpp.

References llvm::Aggressive, assert(), B(), canCombineFMadOrFMA(), llvm::MachineInstr::getFlags(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), hasMoreUses(), isContractableFMul(), llvm::MIPatternMatch::m_GFPExt(), llvm::MIPatternMatch::m_MInstr(), MI, llvm::MIPatternMatch::mi_match(), MRI, and std::swap().

◆ matchCombineFAddFpExtFMulToFMadOrFMAAggressive()

◆ matchCombineFMinMaxNaN()

bool CombinerHelper::matchCombineFMinMaxNaN ( MachineInstr & MI,
unsigned & Info ) const

◆ matchCombineFSubFMulToFMadOrFMA()

bool CombinerHelper::matchCombineFSubFMulToFMadOrFMA ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

Transform (fsub (fmul x, y), z) -> (fma x, y, -z) (fsub (fmul x, y), z) -> (fmad x, y, -z)

Definition at line 6754 of file CombinerHelper.cpp.

References llvm::Aggressive, assert(), B(), canCombineFMadOrFMA(), hasMoreUses(), isContractableFMul(), llvm::MIPatternMatch::m_MInstr(), MI, llvm::MIPatternMatch::mi_match(), and MRI.

◆ matchCombineFSubFNegFMulToFMadOrFMA()

bool CombinerHelper::matchCombineFSubFNegFMulToFMadOrFMA ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

Transform (fsub (fneg (fmul, x, y)), z) -> (fma (fneg x), y, (fneg z)) (fsub (fneg (fmul, x, y)), z) -> (fmad (fneg x), y, (fneg z))

Definition at line 6814 of file CombinerHelper.cpp.

References llvm::Aggressive, assert(), B(), canCombineFMadOrFMA(), llvm::MachineInstr::getFlags(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), isContractableFMul(), llvm::MIPatternMatch::m_GFNeg(), llvm::MIPatternMatch::m_MInstr(), MI, llvm::MIPatternMatch::mi_match(), and MRI.

◆ matchCombineFSubFpExtFMulToFMadOrFMA()

bool CombinerHelper::matchCombineFSubFpExtFMulToFMadOrFMA ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

Transform (fsub (fpext (fmul x, y)), z) -> (fma (fpext x), (fpext y), (fneg z)) (fsub (fpext (fmul x, y)), z) -> (fmad (fpext x), (fpext y), (fneg z))

Definition at line 6865 of file CombinerHelper.cpp.

References llvm::Aggressive, assert(), B(), canCombineFMadOrFMA(), llvm::MachineInstr::getFlags(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), isContractableFMul(), llvm::MIPatternMatch::m_GFPExt(), llvm::MIPatternMatch::m_MInstr(), MI, llvm::MIPatternMatch::mi_match(), and MRI.

◆ matchCombineFSubFpExtFNegFMulToFMadOrFMA()

bool CombinerHelper::matchCombineFSubFpExtFNegFMulToFMadOrFMA ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

Transform (fsub (fpext (fneg (fmul x, y))), z) -> (fneg (fma (fpext x), (fpext y), z)) (fsub (fpext (fneg (fmul x, y))), z) -> (fneg (fmad (fpext x), (fpext y), z))

Definition at line 6919 of file CombinerHelper.cpp.

References llvm::Aggressive, assert(), B(), canCombineFMadOrFMA(), llvm::MachineInstr::getFlags(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), isContractableFMul(), llvm::MIPatternMatch::m_GFNeg(), llvm::MIPatternMatch::m_GFPExt(), llvm::MIPatternMatch::m_MInstr(), MI, llvm::MIPatternMatch::mi_match(), MRI, X, and Y.

◆ matchCombineIndexedLoadStore()

◆ matchCombineInsertVecElts()

◆ matchCombineLoadWithAndMask()

◆ matchCombineMemCpyFamily()

bool CombinerHelper::matchCombineMemCpyFamily ( MachineInstr & MI,
MemCpyFamilyLoweringInfo & MatchInfo,
unsigned MaxLen = 0 ) const

Definition at line 1726 of file CombinerHelper.cpp.

References llvm::canLowerMemCpyFamily(), MI, and MRI.

◆ matchCombineMergeUnmerge()

bool CombinerHelper::matchCombineMergeUnmerge ( MachineInstr & MI,
Register & MatchInfo ) const

Fold away a merge of an unmerge of the corresponding values.

Definition at line 2300 of file CombinerHelper.cpp.

References llvm::cast(), llvm::SmallVectorImpl< T >::emplace_back(), llvm::getOpcodeDef(), I, Merge, MI, MRI, and llvm::SmallVectorTemplateCommon< T, typename >::size().

◆ matchCombineMulToShl()

bool CombinerHelper::matchCombineMulToShl ( MachineInstr & MI,
unsigned & ShiftVal ) const

Transform a multiply by a power-of-2 value to a left shift.

Definition at line 2194 of file CombinerHelper.cpp.

References assert(), llvm::getIConstantVRegValWithLookThrough(), MI, and MRI.

◆ matchCombineShiftToUnmerge()

bool CombinerHelper::matchCombineShiftToUnmerge ( MachineInstr & MI,
unsigned TargetShiftSize,
unsigned & ShiftVal ) const

Reduce a shift by a constant to an unmerge and a shift on a half sized type.

This will not produce a shift smaller than TargetShiftSize.

Definition at line 2510 of file CombinerHelper.cpp.

References assert(), llvm::getIConstantVRegValWithLookThrough(), MI, MRI, and Size.

Referenced by tryCombineShiftToUnmerge().

◆ matchCombineShlOfExtend()

◆ matchCombineShuffleConcat()

◆ matchCombineShuffleVector()

bool CombinerHelper::matchCombineShuffleVector ( MachineInstr & MI,
SmallVectorImpl< Register > & Ops ) const

Check if the G_SHUFFLE_VECTOR MI can be replaced by a concat_vectors.

Ops will contain the operands needed to produce the flattened concat_vectors.

Precondition
MI.getOpcode() == G_SHUFFLE_VECTOR.

Definition at line 588 of file CombinerHelper.cpp.

References AbstractManglingParser< Derived, Alloc >::Ops, assert(), Builder, MI, and MRI.

◆ matchCombineSubToAdd()

◆ matchCombineTruncOfShift()

bool CombinerHelper::matchCombineTruncOfShift ( MachineInstr & MI,
std::pair< MachineInstr *, LLT > & MatchInfo ) const

Transform trunc (shl x, K) to shl (trunc x), K if K < VT.getScalarSizeInBits().

Transforms trunc ([al]shr x, K) to (trunc ([al]shr (MidVT (trunc x)), K)) if K <= (MidVT.getScalarSizeInBits() - VT.getScalarSizeInBits()) MidVT is obtained by finding a legal type between the trunc's src and dst types.

Definition at line 2746 of file CombinerHelper.cpp.

References assert(), llvm::getDefIgnoringCopies(), getMidVTForTruncRightShiftCombine(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), llvm::LLT::getScalarSizeInBits(), getTargetLowering(), isLegalOrBeforeLegalizer(), llvm::Known, MI, MRI, and VT.

◆ matchCombineUnmergeConstant()

bool CombinerHelper::matchCombineUnmergeConstant ( MachineInstr & MI,
SmallVectorImpl< APInt > & Csts ) const

◆ matchCombineUnmergeMergeToPlainValues()

bool CombinerHelper::matchCombineUnmergeMergeToPlainValues ( MachineInstr & MI,
SmallVectorImpl< Register > & Operands ) const

Transform <ty,...> G_UNMERGE(G_MERGE ty X, Y, Z) -> ty X, Y, Z.

Definition at line 2327 of file CombinerHelper.cpp.

References assert(), llvm::cast(), llvm::getOpcodeDef(), llvm::LLT::getSizeInBits(), MI, MRI, Operands, and peekThroughBitcast().

◆ matchCombineUnmergeUndef()

bool CombinerHelper::matchCombineUnmergeUndef ( MachineInstr & MI,
std::function< void(MachineIRBuilder &)> & MatchInfo ) const

Transform G_UNMERGE G_IMPLICIT_DEF -> G_IMPLICIT_DEF, G_IMPLICIT_DEF, ...

Definition at line 2417 of file CombinerHelper.cpp.

References B(), llvm::MIPatternMatch::m_GImplicitDef(), MI, llvm::MIPatternMatch::mi_match(), and MRI.

◆ matchCombineUnmergeWithDeadLanesToTrunc()

bool CombinerHelper::matchCombineUnmergeWithDeadLanesToTrunc ( MachineInstr & MI) const

Transform X, Y<dead> = G_UNMERGE Z -> X = G_TRUNC Z.

Definition at line 2432 of file CombinerHelper.cpp.

References assert(), MI, and MRI.

◆ matchCombineUnmergeZExtToZExt()

bool CombinerHelper::matchCombineUnmergeZExtToZExt ( MachineInstr & MI) const

Transform X, Y = G_UNMERGE(G_ZEXT(Z)) -> X = G_ZEXT(Z); Y = G_CONSTANT 0.

Definition at line 2455 of file CombinerHelper.cpp.

References assert(), llvm::LLT::getSizeInBits(), llvm::LLT::isVector(), llvm::MIPatternMatch::m_GZExt(), llvm::MIPatternMatch::m_Reg(), MI, llvm::MIPatternMatch::mi_match(), and MRI.

◆ matchCombineZextTrunc()

◆ matchCommuteConstantToRHS()

bool CombinerHelper::matchCommuteConstantToRHS ( MachineInstr & MI) const

Match constant LHS ops that should be commuted.

Definition at line 7388 of file CombinerHelper.cpp.

References llvm::getIConstantVRegVal(), llvm::MachineInstr::getOpcode(), llvm::MIPatternMatch::m_MInstr(), MI, llvm::MIPatternMatch::mi_match(), and MRI.

◆ matchCommuteFPConstantToRHS()

bool CombinerHelper::matchCommuteFPConstantToRHS ( MachineInstr & MI) const

Match constant LHS FP ops that should be commuted.

Definition at line 7421 of file CombinerHelper.cpp.

References llvm::MIPatternMatch::m_GFCstOrSplat(), MI, llvm::MIPatternMatch::mi_match(), and MRI.

◆ matchConstantFoldBinOp()

bool CombinerHelper::matchConstantFoldBinOp ( MachineInstr & MI,
APInt & MatchInfo ) const

Do constant folding when opportunities are exposed after MIR building.

Definition at line 5367 of file CombinerHelper.cpp.

References llvm::ConstantFoldBinOp(), MI, and MRI.

◆ matchConstantFoldCastOp()

bool CombinerHelper::matchConstantFoldCastOp ( MachineInstr & MI,
APInt & MatchInfo ) const

Do constant folding when opportunities are exposed after MIR building.

Definition at line 5337 of file CombinerHelper.cpp.

References llvm::ConstantFoldCastOp(), MI, and MRI.

◆ matchConstantFoldFMA()

bool CombinerHelper::matchConstantFoldFMA ( MachineInstr & MI,
ConstantFP *& MatchInfo ) const

◆ matchConstantFoldFPBinOp()

bool CombinerHelper::matchConstantFoldFPBinOp ( MachineInstr & MI,
ConstantFP *& MatchInfo ) const

Do constant FP folding when opportunities are exposed after MIR building.

Definition at line 5378 of file CombinerHelper.cpp.

References llvm::ConstantFoldFPBinOp(), MI, and MRI.

◆ matchConstantFoldUnaryIntOp()

bool CombinerHelper::matchConstantFoldUnaryIntOp ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

Constant fold a unary integer op (G_CTLZ, G_CTTZ, G_CTPOP and their _ZERO_POISON variants, G_ABS, G_BSWAP, G_BITREVERSE) when the operand is a scalar constant or a G_BUILD_VECTOR of constants.

Definition at line 5350 of file CombinerHelper.cpp.

References B(), llvm::ConstantFoldUnaryIntOp(), MI, and MRI.

◆ matchConstantFPOp()

bool CombinerHelper::matchConstantFPOp ( const MachineOperand & MOP,
double C ) const

Return true if MOP is defined by a G_FCONSTANT or splat with a value exactly equal to C.

Definition at line 2997 of file CombinerHelper.cpp.

References C(), llvm::MachineOperand::getReg(), llvm::MachineOperand::isReg(), llvm::MIPatternMatch::m_GFCstOrSplat(), llvm::MIPatternMatch::mi_match(), and MRI.

◆ matchConstantLargerBitWidth()

bool CombinerHelper::matchConstantLargerBitWidth ( MachineInstr & MI,
unsigned ConstIdx ) const

Checks if constant at ConstIdx is larger than MI 's bitwidth.

Parameters
ConstIdxIndex of the constant

Definition at line 3027 of file CombinerHelper.cpp.

References llvm::getIConstantVRegValWithLookThrough(), llvm::LLT::getSizeInBits(), MI, and MRI.

◆ matchConstantOp()

bool CombinerHelper::matchConstantOp ( const MachineOperand & MOP,
int64_t C ) const

Return true if MOP is defined by a G_CONSTANT or splat with a value equal to C.

Definition at line 2988 of file CombinerHelper.cpp.

References C(), llvm::MachineOperand::getReg(), llvm::isConstantOrConstantSplatVector(), llvm::MachineOperand::isReg(), and MRI.

◆ matchConstantSelectCmp()

bool CombinerHelper::matchConstantSelectCmp ( MachineInstr & MI,
unsigned & OpIdx ) const

Return true if a G_SELECT instruction MI has a constant comparison.

If true, OpIdx will store the operand index of the known selected value.

Definition at line 2879 of file CombinerHelper.cpp.

References llvm::cast(), llvm::GSelect::getCondReg(), llvm::isConstantOrConstantSplatVector(), MI, and MRI.

◆ matchCountZeroToZeroPoison()

bool CombinerHelper::matchCountZeroToZeroPoison ( MachineInstr & MI) const

Definition at line 8851 of file CombinerHelper.cpp.

References getCountZeroPoisonOpcode(), isLegalOrBeforeLegalizer(), MI, MRI, and VT.

◆ matchCtls()

◆ matchDivByPow2()

bool CombinerHelper::matchDivByPow2 ( MachineInstr & MI,
bool IsSigned ) const

Given an G_SDIV MI expressing a signed divided by a pow2 constant, return expressions that implements it by shifting.

Definition at line 6048 of file CombinerHelper.cpp.

References assert(), C(), llvm::cast(), llvm::dyn_cast(), llvm::matchUnaryPredicate(), MI, and MRI.

◆ matchEqualDefs()

◆ matchExtendThroughPhis()

◆ matchExtOfExt()

◆ matchExtractAllEltsFromBuildVector()

bool CombinerHelper::matchExtractAllEltsFromBuildVector ( MachineInstr & MI,
SmallVectorImpl< std::pair< Register, MachineInstr * > > & MatchInfo ) const

◆ matchExtractVecEltBuildVec()

◆ matchExtractVectorElement()

◆ matchExtractVectorElementWithBuildVector()

bool CombinerHelper::matchExtractVectorElementWithBuildVector ( const MachineInstr & MI,
const MachineInstr & MI2,
BuildFnTy & MatchInfo ) const

◆ matchExtractVectorElementWithBuildVectorTrunc()

◆ matchExtractVectorElementWithDifferentIndices()

bool CombinerHelper::matchExtractVectorElementWithDifferentIndices ( const MachineOperand & MO,
BuildFnTy & MatchInfo ) const

◆ matchExtractVectorElementWithShuffleVector()

◆ matchFoldAMinusC1MinusC2()

◆ matchFoldAMinusC1PlusC2()

bool CombinerHelper::matchFoldAMinusC1PlusC2 ( const MachineInstr & MI,
BuildFnTy & MatchInfo ) const

◆ matchFoldAPlusC1MinusC2()

bool CombinerHelper::matchFoldAPlusC1MinusC2 ( const MachineInstr & MI,
BuildFnTy & MatchInfo ) const

◆ matchFoldBinOpIntoSelect()

bool CombinerHelper::matchFoldBinOpIntoSelect ( MachineInstr & MI,
unsigned & SelectOpNo ) const

Push a binary operator through a select on constants.

binop (select cond, K0, K1), K2 -> select cond, (binop K0, K2), (binop K1, K2)

Definition at line 3955 of file CombinerHelper.cpp.

References llvm::isAllOnesOrAllOnesSplat(), llvm::isConstantOrConstantVector(), llvm::isNullOrNullSplat(), llvm::MIPatternMatch::m_GISelect(), llvm::MIPatternMatch::m_MInstr(), llvm::MIPatternMatch::m_Reg(), MI, llvm::MIPatternMatch::mi_match(), and MRI.

◆ matchFoldC1Minus2MinusC2()

◆ matchFoldC2MinusAPlusC1()

bool CombinerHelper::matchFoldC2MinusAPlusC1 ( const MachineInstr & MI,
BuildFnTy & MatchInfo ) const

◆ matchFPowIExpansion()

bool CombinerHelper::matchFPowIExpansion ( MachineInstr & MI,
int64_t Exponent ) const

Match FPOWI if it's safe to extend it into a series of multiplications.

Definition at line 8333 of file CombinerHelper.cpp.

References llvm::Exponent, getTargetLowering(), llvm::TargetLoweringBase::isBeneficialToExpandPowI(), and MI.

◆ matchFreezeOfSingleMaybePoisonOperand()

◆ matchFsubToFneg()

bool CombinerHelper::matchFsubToFneg ( MachineInstr & MI,
Register & MatchInfo ) const

◆ matchFunnelShiftToRotate()

bool CombinerHelper::matchFunnelShiftToRotate ( MachineInstr & MI) const

Match an FSHL or FSHR that can be combined to a ROTR or ROTL rotate.

Definition at line 4676 of file CombinerHelper.cpp.

References assert(), isLegalOrBeforeLegalizer(), MI, MRI, Opc, X, and Y.

◆ matchHoistLogicOpWithSameOpcodeHands()

◆ matchICmpToLHSKnownBits()

bool CombinerHelper::matchICmpToLHSKnownBits ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

◆ matchICmpToTrueFalseKnownBits()

bool CombinerHelper::matchICmpToTrueFalseKnownBits ( MachineInstr & MI,
int64_t & MatchInfo ) const
Returns
true if a G_ICMP instruction MI can be replaced with a true or false constant based off of KnownBits information.

Definition at line 4729 of file CombinerHelper.cpp.

References assert(), llvm::ICmpInst::compare(), llvm::getICmpTrueVal(), getTargetLowering(), llvm::CmpInst::ICMP_UGE, llvm::CmpInst::ICMP_ULT, MI, MRI, and VT.

◆ matchInsertExtractVecEltOutOfBounds()

bool CombinerHelper::matchInsertExtractVecEltOutOfBounds ( MachineInstr & MI) const

Return true if a G_{EXTRACT,INSERT}_VECTOR_ELT has an out of range index.

Definition at line 2862 of file CombinerHelper.cpp.

References assert(), llvm::getIConstantVRegVal(), llvm::LLT::getNumElements(), llvm::LLT::isScalableVector(), MI, and MRI.

◆ matchInsertVectorElementOOB()

bool CombinerHelper::matchInsertVectorElementOOB ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

◆ matchLoadOrCombine()

◆ matchLshrOfTruncOfLshr()

◆ matchMergeXAndUndef()

bool CombinerHelper::matchMergeXAndUndef ( const MachineInstr & MI,
BuildFnTy & MatchInfo ) const

Definition at line 30 of file CombinerHelperArtifacts.cpp.

References assert(), B(), llvm::cast(), isLegalOrBeforeLegalizer(), Merge, MI, and MRI.

◆ matchMergeXAndZero()

bool CombinerHelper::matchMergeXAndZero ( const MachineInstr & MI,
BuildFnTy & MatchInfo ) const

Definition at line 59 of file CombinerHelperArtifacts.cpp.

References B(), llvm::cast(), isLegalOrBeforeLegalizer(), Merge, MI, and MRI.

◆ matchMulOBy0()

bool CombinerHelper::matchMulOBy0 ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

Match: (G_*MULO x, 0) -> 0 + no carry out.

Definition at line 5525 of file CombinerHelper.cpp.

References assert(), B(), isConstantLegalOrBeforeLegalizer(), llvm::MIPatternMatch::m_SpecificICstOrSplat(), MI, llvm::MIPatternMatch::mi_match(), and MRI.

◆ matchMulOBy2()

bool CombinerHelper::matchMulOBy2 ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

Match: (G_UMULO x, 2) -> (G_UADDO x, x) (G_SMULO x, 2) -> (G_SADDO x, x)

Definition at line 5506 of file CombinerHelper.cpp.

References assert(), B(), Builder, llvm::MIPatternMatch::m_SpecificICstOrSplat(), MI, llvm::MIPatternMatch::mi_match(), MRI, Observer, and Opc.

◆ matchMulOfVScale()

◆ matchNarrowBinop()

bool CombinerHelper::matchNarrowBinop ( const MachineInstr & TruncMI,
const MachineInstr & BinopMI,
BuildFnTy & MatchInfo ) const

◆ matchNarrowBinopFeedingAnd()

bool CombinerHelper::matchNarrowBinopFeedingAnd ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

◆ matchNonNegZext()

◆ matchNotCmp()

◆ matchOperandIsKnownToBeAPowerOfTwo()

bool CombinerHelper::matchOperandIsKnownToBeAPowerOfTwo ( const MachineOperand & MO,
bool OrNegative = false ) const

Check if operand MO is known to be a power of 2.

When OrNegative is true, also match operands whose negation is a power of 2 (i.e. whose absolute value is a power of 2).

Definition at line 3073 of file CombinerHelper.cpp.

References llvm::MachineOperand::getReg(), llvm::isKnownToBeAPowerOfTwo(), MRI, and VT.

◆ matchOptBrCondByInvertingCond()

bool CombinerHelper::matchOptBrCondByInvertingCond ( MachineInstr & MI,
MachineInstr *& BrCond ) const

If a brcond's true block is not the fallthrough, make it so by inverting the condition and swapping operands.

Definition at line 1667 of file CombinerHelper.cpp.

References assert(), llvm::MachineOperand::getMBB(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), MBB, and MI.

◆ matchOr()

bool CombinerHelper::matchOr ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

Combine ors.

Definition at line 8146 of file CombinerHelper.cpp.

References llvm::cast(), and MI.

◆ matchOrShiftToFunnelShift()

◆ matchOverlappingAnd()

bool CombinerHelper::matchOverlappingAnd ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

Fold and(and(x, C1), C2) -> C1&C2 ? and(x, C1&C2) : 0.

and(and(x, C1), C2) -> C1&C2 ? and(x, C1&C2) : 0

Definition at line 3429 of file CombinerHelper.cpp.

References assert(), B(), llvm::MIPatternMatch::m_GAnd(), llvm::MIPatternMatch::m_ICst(), llvm::MIPatternMatch::m_Reg(), MI, llvm::MIPatternMatch::mi_match(), MRI, and replaceRegWith().

◆ matchPtrAddImmedChain()

◆ matchPtrAddZero()

bool CombinerHelper::matchPtrAddZero ( MachineInstr & MI) const

◆ matchReassocCommBinOp()

bool CombinerHelper::matchReassocCommBinOp ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

Reassociate commutative binary operations like G_ADD.

Definition at line 5321 of file CombinerHelper.cpp.

References MI, Opc, and tryReassocBinOp().

◆ matchReassocConstantInnerLHS()

◆ matchReassocConstantInnerRHS()

bool CombinerHelper::matchReassocConstantInnerRHS ( GPtrAdd & MI,
MachineInstr * RHS,
BuildFnTy & MatchInfo ) const

◆ matchReassocFoldConstantsInSubTree()

bool CombinerHelper::matchReassocFoldConstantsInSubTree ( GPtrAdd & MI,
MachineInstr * LHS,
MachineInstr * RHS,
BuildFnTy & MatchInfo ) const

◆ matchReassocPtrAdd()

bool CombinerHelper::matchReassocPtrAdd ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

Reassociate pointer calculations with G_ADD involved, to allow better addressing mode usage.

Definition at line 5248 of file CombinerHelper.cpp.

References llvm::cast(), llvm::MIPatternMatch::m_MInstr(), matchReassocConstantInnerLHS(), matchReassocConstantInnerRHS(), matchReassocFoldConstantsInSubTree(), MI, llvm::MIPatternMatch::mi_match(), and MRI.

◆ matchRedundantAnd()

bool CombinerHelper::matchRedundantAnd ( MachineInstr & MI,
Register & Replacement ) const
Returns
true if MI is a G_AND instruction whose operands are x and y where x & y == x or x & y == y. (E.g., one of operands is all-ones value.)
Parameters
[in]MI- The G_AND instruction.
[out]Replacement- A register the G_AND should be replaced with on success.

Definition at line 3456 of file CombinerHelper.cpp.

References assert(), llvm::canReplaceReg(), llvm::KnownBits::isUnknown(), MI, MRI, llvm::KnownBits::One, VT, and llvm::KnownBits::Zero.

◆ matchRedundantBinOpInEquality()

bool CombinerHelper::matchRedundantBinOpInEquality ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

Transform: (X + Y) == X -> Y == 0 (X - Y) == X -> Y == 0 (X ^ Y) == X -> Y == 0 (X + Y) != X -> Y != 0 (X - Y) != X -> Y != 0 (X ^ Y) != X -> Y != 0.

Definition at line 7300 of file CombinerHelper.cpp.

References assert(), B(), llvm::CmpInst::isEquality(), llvm::MIPatternMatch::m_any_of(), llvm::MIPatternMatch::m_c_GICmp(), llvm::MIPatternMatch::m_GAdd(), llvm::MIPatternMatch::m_GSub(), llvm::MIPatternMatch::m_GXor(), llvm::MIPatternMatch::m_Pred(), llvm::MIPatternMatch::m_Reg(), MI, llvm::MIPatternMatch::mi_match(), MRI, Register, X, and Y.

◆ matchRedundantNegOperands()

bool CombinerHelper::matchRedundantNegOperands ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

Transform (fadd x, fneg(y)) -> (fsub x, y) (fadd fneg(x), y) -> (fsub y, x) (fsub x, fneg(y)) -> (fadd x, y) (fmul fneg(x), fneg(y)) -> (fmul x, y) (fdiv fneg(x), fneg(y)) -> (fdiv x, y) (fmad fneg(x), fneg(y), z) -> (fmad x, y, z) (fma fneg(x), fneg(y), z) -> (fma x, y, z)

fold (fsub x, fneg(y)) -> (fadd x, y)

Definition at line 6312 of file CombinerHelper.cpp.

References assert(), B(), isLegalOrBeforeLegalizer(), llvm::MIPatternMatch::m_GFAdd(), llvm::MIPatternMatch::m_GFNeg(), llvm::MIPatternMatch::m_GFSub(), llvm::MIPatternMatch::m_Reg(), MI, llvm::MIPatternMatch::mi_match(), MRI, Observer, Opc, X, and Y.

◆ matchRedundantOr()

bool CombinerHelper::matchRedundantOr ( MachineInstr & MI,
Register & Replacement ) const
Returns
true if MI is a G_OR instruction whose operands are x and y where x | y == x or x | y == y. (E.g., one of operands is all-zeros value.)
Parameters
[in]MI- The G_OR instruction.
[out]Replacement- A register the G_OR should be replaced with on success.

Definition at line 3512 of file CombinerHelper.cpp.

References assert(), llvm::canReplaceReg(), MI, MRI, llvm::KnownBits::One, VT, and llvm::KnownBits::Zero.

◆ matchRedundantSExtInReg()

bool CombinerHelper::matchRedundantSExtInReg ( MachineInstr & MI) const
Returns
true if MI is a G_SEXT_INREG that can be erased.

Definition at line 3554 of file CombinerHelper.cpp.

References MI, MRI, and VT.

◆ matchRedundantSextInReg()

◆ matchRepeatedFPDivisor()

◆ matchRotateOutOfRange()

bool CombinerHelper::matchRotateOutOfRange ( MachineInstr & MI) const

Definition at line 4700 of file CombinerHelper.cpp.

References assert(), C(), llvm::dyn_cast(), llvm::matchUnaryPredicate(), MI, and MRI.

◆ matchSDivOrSRemByConst()

◆ matchSelect()

bool CombinerHelper::matchSelect ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

Combine selects.

Definition at line 7884 of file CombinerHelper.cpp.

References llvm::cast(), MI, and Select.

◆ matchSelectIMinMax()

◆ matchSelectSameVal()

bool CombinerHelper::matchSelectSameVal ( MachineInstr & MI) const

Optimize (cond ? x : x) -> x.

Definition at line 3065 of file CombinerHelper.cpp.

References assert(), llvm::canReplaceReg(), matchEqualDefs(), MI, and MRI.

◆ matchSextInRegOfLoad()

◆ matchSextOfTrunc()

◆ matchSextTruncSextLoad()

bool CombinerHelper::matchSextTruncSextLoad ( MachineInstr & MI) const

◆ matchShiftImmedChain()

◆ matchShiftOfShiftedLogic()

bool CombinerHelper::matchShiftOfShiftedLogic ( MachineInstr & MI,
ShiftOfShiftedLogic & MatchInfo ) const

If we have a shift-by-constant of a bitwise logic op that itself has a shift-by-constant operand with identical opcode, we may be able to convert that into 2 independent shifts followed by the logic op.

Definition at line 2001 of file CombinerHelper.cpp.

References assert(), llvm::getIConstantVRegValWithLookThrough(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), llvm::ShiftOfShiftedLogic::Logic, llvm::ShiftOfShiftedLogic::LogicNonShiftReg, llvm::MIPatternMatch::m_MInstr(), MI, llvm::MIPatternMatch::mi_match(), MRI, llvm::ShiftOfShiftedLogic::Shift2, and llvm::ShiftOfShiftedLogic::ValSum.

◆ matchShiftsTooBig()

bool CombinerHelper::matchShiftsTooBig ( MachineInstr & MI,
std::optional< int64_t > & MatchInfo ) const

Match shifts greater or equal to the range (the bitwidth of the result datatype, or the effective bitwidth of the source value).

Definition at line 7368 of file CombinerHelper.cpp.

References C(), llvm::dyn_cast(), getMinUselessShift(), llvm::LLT::getScalarSizeInBits(), llvm::matchUnaryPredicate(), MI, MRI, and VT.

◆ matchShlOfVScale()

◆ matchShuffleDisjointMask()

bool CombinerHelper::matchShuffleDisjointMask ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

Turn shuffle a, b, mask -> shuffle undef, b, mask iff mask does not reference a.

Definition at line 8631 of file CombinerHelper.cpp.

References B(), llvm::cast(), commuteMask(), llvm::getOpcodeDef(), isLegalOrBeforeLegalizer(), MI, MRI, and llvm::Undef.

◆ matchShuffleUndefRHS()

bool CombinerHelper::matchShuffleUndefRHS ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

Remove references to rhs if it is undef.

Definition at line 8587 of file CombinerHelper.cpp.

References B(), llvm::cast(), Changed, MI, MRI, llvm::SmallVectorTemplateBase< T, bool >::push_back(), and llvm::ArrayRef< T >::size().

◆ matchSimplifyAddToSub()

bool CombinerHelper::matchSimplifyAddToSub ( MachineInstr & MI,
std::tuple< Register, Register > & MatchInfo ) const

Return true if MI is a G_ADD which can be simplified to a G_SUB.

Definition at line 3111 of file CombinerHelper.cpp.

References llvm::MIPatternMatch::m_Neg(), llvm::MIPatternMatch::m_Reg(), MI, llvm::MIPatternMatch::mi_match(), and MRI.

◆ matchSimplifyNegMinMax()

◆ matchSimplifySelectToMinMax()

bool CombinerHelper::matchSimplifySelectToMinMax ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const
Returns
true if it is possible to simplify a select instruction MI to a min/max instruction of some sort.

Definition at line 7285 of file CombinerHelper.cpp.

References assert(), Cond, llvm::MIPatternMatch::m_GTrunc(), llvm::MIPatternMatch::m_OneNonDBGUse(), llvm::MIPatternMatch::m_Reg(), MI, llvm::MIPatternMatch::mi_match(), and MRI.

◆ matchSubAddSameReg()

bool CombinerHelper::matchSubAddSameReg ( MachineInstr & MI,
BuildFnTy & MatchInfo ) const

◆ matchSuboCarryOut()

◆ matchSubOfVScale()

◆ matchTruncateOfExt()

bool CombinerHelper::matchTruncateOfExt ( const MachineInstr & Root,
const MachineInstr & ExtMI,
BuildFnTy & MatchInfo ) const

◆ matchTruncBuildVectorFold()

bool CombinerHelper::matchTruncBuildVectorFold ( MachineInstr & MI,
Register & MatchInfo ) const

◆ matchTruncLshrBuildVectorFold()

◆ matchTruncSSatS()

◆ matchTruncSSatU()

◆ matchTruncUSatU()

◆ matchTruncUSatUToFPTOUISat()

bool CombinerHelper::matchTruncUSatUToFPTOUISat ( MachineInstr & MI,
MachineInstr & SrcMI ) const

◆ matchUDivOrURemByConst()

◆ matchUMulHToLShr()

◆ matchUndefSelectCmp()

bool CombinerHelper::matchUndefSelectCmp ( MachineInstr & MI) const

Return true if a G_SELECT instruction MI has an undef comparison.

Definition at line 2856 of file CombinerHelper.cpp.

References assert(), llvm::getOpcodeDef(), MI, and MRI.

◆ matchUndefShuffleVectorMask()

bool CombinerHelper::matchUndefShuffleVectorMask ( MachineInstr & MI) const

Return true if a G_SHUFFLE_VECTOR instruction MI has an undef mask.

Definition at line 2844 of file CombinerHelper.cpp.

References llvm::all_of(), assert(), and MI.

◆ matchUndefStore()

bool CombinerHelper::matchUndefStore ( MachineInstr & MI) const

Return true if a G_STORE instruction MI is storing an undef value.

Definition at line 2850 of file CombinerHelper.cpp.

References assert(), llvm::getOpcodeDef(), MI, and MRI.

◆ matchUnmergeValuesAnyExtBuildVector()

◆ matchUseVectorTruncate()

◆ matchXorOfAndWithSameReg()

bool CombinerHelper::matchXorOfAndWithSameReg ( MachineInstr & MI,
std::pair< Register, Register > & MatchInfo ) const

Fold (xor (and x, y), y) -> (and (not x), y) {.

Definition at line 3876 of file CombinerHelper.cpp.

References assert(), llvm::MIPatternMatch::m_GAnd(), llvm::MIPatternMatch::m_Reg(), MI, llvm::MIPatternMatch::mi_match(), MRI, std::swap(), X, and Y.

◆ matchZextOfTrunc()

◆ replaceInstWithConstant() [1/2]

void CombinerHelper::replaceInstWithConstant ( MachineInstr & MI,
APInt C ) const

Replace an instruction with a G_CONSTANT with value C.

Definition at line 3092 of file CombinerHelper.cpp.

References assert(), Builder, C(), and MI.

◆ replaceInstWithConstant() [2/2]

void CombinerHelper::replaceInstWithConstant ( MachineInstr & MI,
int64_t C ) const

Replace an instruction with a G_CONSTANT with value C.

Definition at line 3085 of file CombinerHelper.cpp.

References assert(), Builder, C(), and MI.

◆ replaceInstWithFConstant() [1/2]

void CombinerHelper::replaceInstWithFConstant ( MachineInstr & MI,
ConstantFP * CFP ) const

Replace an instruction with an G_FCONSTANT with value CFP.

Definition at line 3098 of file CombinerHelper.cpp.

References assert(), Builder, llvm::ConstantFP::getValueAPF(), and MI.

◆ replaceInstWithFConstant() [2/2]

void CombinerHelper::replaceInstWithFConstant ( MachineInstr & MI,
double C ) const

Replace an instruction with a G_FCONSTANT with value C.

Definition at line 3078 of file CombinerHelper.cpp.

References assert(), Builder, C(), and MI.

◆ replaceInstWithUndef()

void CombinerHelper::replaceInstWithUndef ( MachineInstr & MI) const

Replace an instruction with a G_IMPLICIT_DEF.

Definition at line 3105 of file CombinerHelper.cpp.

References assert(), Builder, and MI.

◆ replaceOpcodeWith()

void CombinerHelper::replaceOpcodeWith ( MachineInstr & FromMI,
unsigned ToOpcode ) const

Replace the opcode in instruction with a new opcode and inform the observer of the changes.

Definition at line 212 of file CombinerHelper.cpp.

References Builder, Observer, and llvm::MachineInstr::setDesc().

Referenced by applyCountZeroToZeroPoison(), and llvm::AMDGPUCombinerHelper::applyFoldableFneg().

◆ replaceRegOpWith()

void CombinerHelper::replaceRegOpWith ( MachineRegisterInfo & MRI,
MachineOperand & FromRegOp,
Register ToReg ) const

Replace a single register operand with a new register and inform the observer of the changes.

Definition at line 201 of file CombinerHelper.cpp.

References assert(), llvm::MachineOperand::getParent(), MRI, Observer, and llvm::MachineOperand::setReg().

Referenced by applyCombineExtendingLoads(), llvm::AMDGPUCombinerHelper::applyFoldableFneg(), and matchFreezeOfSingleMaybePoisonOperand().

◆ replaceRegWith()

◆ replaceSingleDefInstWithOperand()

void CombinerHelper::replaceSingleDefInstWithOperand ( MachineInstr & MI,
unsigned OpIdx ) const

Delete MI and replace all of its uses with its OpIdx-th operand.

Definition at line 3008 of file CombinerHelper.cpp.

References assert(), llvm::canReplaceReg(), MI, MRI, and replaceRegWith().

◆ replaceSingleDefInstWithReg()

void CombinerHelper::replaceSingleDefInstWithReg ( MachineInstr & MI,
Register Replacement ) const

Delete MI and replace all of its uses with Replacement.

Definition at line 3018 of file CombinerHelper.cpp.

References assert(), llvm::canReplaceReg(), MI, MRI, and replaceRegWith().

Referenced by applyExtractVecEltBuildVec(), applySDivOrSRemByConst(), and applyUDivOrURemByConst().

◆ setRegBank()

void CombinerHelper::setRegBank ( Register Reg,
const RegisterBank * RegBank ) const

Set the register bank of Reg.

Does nothing if the RegBank is null. This is the counterpart to getRegBank.

Definition at line 225 of file CombinerHelper.cpp.

References MRI.

Referenced by applyPtrAddImmedChain().

◆ tryCombineCopy()

bool CombinerHelper::tryCombineCopy ( MachineInstr & MI) const

If MI is COPY, try to combine it.

Returns true if MI changed.

Definition at line 231 of file CombinerHelper.cpp.

References applyCombineCopy(), matchCombineCopy(), and MI.

◆ tryCombineExtendingLoads()

bool CombinerHelper::tryCombineExtendingLoads ( MachineInstr & MI) const

If MI is extend that consumes the result of a load, try to combine it.

Returns true if MI changed.

Definition at line 765 of file CombinerHelper.cpp.

References applyCombineExtendingLoads(), matchCombineExtendingLoads(), and MI.

◆ tryCombineMemCpyFamily()

bool CombinerHelper::tryCombineMemCpyFamily ( MachineInstr & MI,
unsigned MaxLen = 0 ) const

Optimize memcpy intrinsics et al, e.g.

constant len calls. /p MaxLen if non-zero specifies the max length of a mem libcall to inline.

For example (pre-indexed):

$addr = G_PTR_ADD $base, $offset
[...]
$val = G_LOAD $addr
[...]
$whatever = COPY $addr

-->

$val, $addr = G_INDEXED_LOAD $base, $offset, 1 (IsPre)
[...]
$whatever = COPY $addr

or (post-indexed):

G_STORE $val, $base
[...]
$addr = G_PTR_ADD $base, $offset
[...]
$whatever = COPY $addr

-->

$addr = G_INDEXED_STORE $val, $base, $offset
[...]
$whatever = COPY $addr 

Definition at line 1747 of file CombinerHelper.cpp.

References llvm::MachineIRBuilder::getMF(), llvm::LegalizerHelper::Legalized, llvm::LegalizerHelper::lowerMemCpyFamily(), and MI.

◆ tryCombineShiftToUnmerge()

bool CombinerHelper::tryCombineShiftToUnmerge ( MachineInstr & MI,
unsigned TargetShiftAmount ) const

◆ tryReassocBinOp()

bool CombinerHelper::tryReassocBinOp ( unsigned Opc,
Register DstReg,
Register Op0,
Register Op1,
BuildFnTy & MatchInfo ) const

Member Data Documentation

◆ Builder

MachineIRBuilder& llvm::CombinerHelper::Builder
protected

Definition at line 117 of file CombinerHelper.h.

Referenced by applyAshShlToSextInreg(), applyBuildFnMO(), applyBuildFnNoErase(), applyBuildInstructionSteps(), applyCombineAddP2IToPtrAdd(), applyCombineBuildVectorOfBitcast(), applyCombineConcatVectors(), applyCombineConstantFoldFpUnary(), applyCombineConstPtrAddToI2P(), applyCombineDivRem(), applyCombineExtendingLoads(), applyCombineIndexedLoadStore(), applyCombineInsertVecElts(), applyCombineP2IToI2P(), applyCombineShiftToUnmerge(), applyCombineShlOfExtend(), applyCombineShuffleConcat(), applyCombineShuffleToBuildVector(), applyCombineShuffleVector(), applyCombineTruncOfShift(), applyCombineUnmergeConstant(), applyCombineUnmergeMergeToPlainValues(), applyCombineUnmergeWithDeadLanesToTrunc(), applyCombineUnmergeZExtToZExt(), applyExpandFPowI(), llvm::AMDGPUCombinerHelper::applyExpandPromotedF16FMed3(), applyExtendThroughPhis(), applyExtractVecEltBuildVec(), llvm::AMDGPUCombinerHelper::applyFoldableFneg(), applyFoldBinOpIntoSelect(), llvm::AMDGPUCombinerHelper::applyFoldFAbsFptrunc(), applyFsubToFneg(), applyFunnelShiftConstantModulo(), applyFunnelShiftToRotate(), applyLshrOfTruncOfLshr(), llvm::SPIRVCombinerHelper::applyMatrixMultiply(), llvm::SPIRVCombinerHelper::applyMatrixTranspose(), applyNotCmp(), applyOptBrCondByInvertingCond(), applyRepeatedFPDivisor(), applyRotateOutOfRange(), applySDivByPow2(), applySextInRegOfLoad(), applyShiftImmedChain(), applyShiftOfShiftedLogic(), applySimplifyAddToSub(), applySimplifySRemByPow2(), applySimplifyURemByPow2(), llvm::SPIRVCombinerHelper::applySPIRVDistance(), llvm::SPIRVCombinerHelper::applySPIRVFaceForward(), llvm::SPIRVCombinerHelper::applySPIRVNormalize(), applyTruncSSatS(), applyTruncSSatU(), applyUDivByPow2(), applyUMulHToLShr(), applyUseVectorTruncate(), applyXorOfAndWithSameReg(), buildSDivOrSRemUsingMul(), buildUDivOrURemUsingMul(), CombinerHelper(), getBuilder(), getContext(), getMachineFunction(), getTargetLowering(), matchCombineConcatVectors(), matchCombineConstPtrAddToI2P(), llvm::AMDGPUCombinerHelper::matchCombineFmulWithSelectToFldexp(), matchCombineShuffleVector(), matchEqualDefs(), matchExtendThroughPhis(), matchMulOBy2(), matchNarrowBinopFeedingAnd(), matchNotCmp(), matchPtrAddZero(), matchReassocConstantInnerRHS(), replaceInstWithConstant(), replaceInstWithConstant(), replaceInstWithFConstant(), replaceInstWithFConstant(), replaceInstWithUndef(), replaceOpcodeWith(), and replaceRegWith().

◆ IsPreLegalize

◆ LI

◆ MDT

◆ MRI

MachineRegisterInfo& llvm::CombinerHelper::MRI
protected

Definition at line 118 of file CombinerHelper.h.

Referenced by applyAshShlToSextInreg(), applyBuildFnMO(), applyCombineAddP2IToPtrAdd(), applyCombineBuildUnmerge(), applyCombineBuildVectorOfBitcast(), applyCombineConcatVectors(), applyCombineConstantFoldFpUnary(), applyCombineCopy(), applyCombineExtendingLoads(), applyCombineIndexedLoadStore(), applyCombineInsertVecElts(), applyCombineMulToShl(), applyCombineShiftToUnmerge(), applyCombineShlOfExtend(), applyCombineShuffleConcat(), applyCombineShuffleToBuildVector(), applyCombineShuffleVector(), applyCombineTruncOfShift(), applyCombineUnmergeMergeToPlainValues(), applyCombineUnmergeZExtToZExt(), applyExpandFPowI(), llvm::AMDGPUCombinerHelper::applyExpandPromotedF16FMed3(), applyExtendThroughPhis(), applyExtractAllEltsFromBuildVector(), applyExtractVecEltBuildVec(), llvm::AMDGPUCombinerHelper::applyFoldableFneg(), applyFoldBinOpIntoSelect(), llvm::AMDGPUCombinerHelper::applyFoldFAbsFptrunc(), applyFsubToFneg(), applyFunnelShiftConstantModulo(), applyNotCmp(), applyOptBrCondByInvertingCond(), applyPtrAddImmedChain(), applyRepeatedFPDivisor(), applyRotateOutOfRange(), applySDivByPow2(), applySextInRegOfLoad(), applyShiftImmedChain(), applyShiftOfShiftedLogic(), applySimplifySRemByPow2(), applySimplifyURemByPow2(), llvm::SPIRVCombinerHelper::applySPIRVDistance(), llvm::SPIRVCombinerHelper::applySPIRVFaceForward(), applyUDivByPow2(), applyUMulHToLShr(), applyUseVectorTruncate(), applyXorOfAndWithSameReg(), buildSDivOrSRemUsingMul(), buildUDivOrURemUsingMul(), canCombineFMadOrFMA(), CombinerHelper(), getRegBank(), matchAddEToAddO(), matchAddOfVScale(), matchAddOverflow(), matchAddSubSameReg(), matchAndOrDisjointMask(), matchAshrShlToSextInreg(), matchAVG(), matchBinOpSameVal(), matchBinopWithNeg(), matchBitfieldExtractFromAnd(), matchBitfieldExtractFromSExtInReg(), matchBitfieldExtractFromShr(), matchBitfieldExtractFromShrAnd(), matchBuildVectorIdentityFold(), matchCanonicalizeFCmp(), matchCanonicalizeICmp(), matchCastOfBuildVector(), matchCastOfInteger(), matchCastOfSelect(), matchCombineAddP2IToPtrAdd(), matchCombineAnyExtTrunc(), matchCombineBuildUnmerge(), matchCombineBuildVectorOfBitcast(), matchCombineConcatVectors(), matchCombineConstPtrAddToI2P(), matchCombineCopy(), matchCombineDivRem(), matchCombineExtendingLoads(), matchCombineExtractedVectorLoad(), matchCombineFAddFMAFMulToFMadOrFMA(), matchCombineFAddFMulToFMadOrFMA(), matchCombineFAddFpExtFMulToFMadOrFMA(), matchCombineFAddFpExtFMulToFMadOrFMAAggressive(), matchCombineFMinMaxNaN(), llvm::AMDGPUCombinerHelper::matchCombineFmulWithSelectToFldexp(), matchCombineFSubFMulToFMadOrFMA(), matchCombineFSubFNegFMulToFMadOrFMA(), matchCombineFSubFpExtFMulToFMadOrFMA(), matchCombineFSubFpExtFNegFMulToFMadOrFMA(), matchCombineInsertVecElts(), matchCombineLoadWithAndMask(), matchCombineMemCpyFamily(), matchCombineMergeUnmerge(), matchCombineMulToShl(), matchCombineShiftToUnmerge(), matchCombineShlOfExtend(), matchCombineShuffleConcat(), matchCombineShuffleVector(), matchCombineSubToAdd(), matchCombineTruncOfShift(), matchCombineUnmergeConstant(), matchCombineUnmergeMergeToPlainValues(), matchCombineUnmergeUndef(), matchCombineUnmergeWithDeadLanesToTrunc(), matchCombineUnmergeZExtToZExt(), matchCombineZextTrunc(), matchCommuteConstantToRHS(), matchCommuteFPConstantToRHS(), matchConstantFoldBinOp(), matchConstantFoldCastOp(), matchConstantFoldFMA(), matchConstantFoldFPBinOp(), matchConstantFoldUnaryIntOp(), matchConstantFPOp(), llvm::AMDGPUCombinerHelper::matchConstantIs32BitMask(), matchConstantLargerBitWidth(), matchConstantOp(), matchConstantSelectCmp(), matchCountZeroToZeroPoison(), matchCtls(), matchDivByPow2(), matchEqualDefs(), llvm::AMDGPUCombinerHelper::matchExpandPromotedF16FMed3(), matchExtendThroughPhis(), matchExtOfExt(), matchExtractAllEltsFromBuildVector(), matchExtractVecEltBuildVec(), matchExtractVectorElement(), matchExtractVectorElementWithBuildVector(), matchExtractVectorElementWithBuildVectorTrunc(), matchExtractVectorElementWithDifferentIndices(), matchExtractVectorElementWithShuffleVector(), llvm::SPIRVCombinerHelper::matchFDivToNormalize(), llvm::AMDGPUCombinerHelper::matchFoldableFneg(), matchFoldAMinusC1MinusC2(), matchFoldAMinusC1PlusC2(), matchFoldAPlusC1MinusC2(), matchFoldBinOpIntoSelect(), matchFoldC1Minus2MinusC2(), matchFoldC2MinusAPlusC1(), llvm::AMDGPUCombinerHelper::matchFoldFAbsFptrunc(), matchFreezeOfSingleMaybePoisonOperand(), matchFsubToFneg(), matchFunnelShiftToRotate(), matchHoistLogicOpWithSameOpcodeHands(), matchICmpToLHSKnownBits(), matchICmpToTrueFalseKnownBits(), matchInsertExtractVecEltOutOfBounds(), matchInsertVectorElementOOB(), llvm::SPIRVCombinerHelper::matchLengthToDistance(), matchLoadOrCombine(), matchLshrOfTruncOfLshr(), matchMergeXAndUndef(), matchMergeXAndZero(), matchMulOBy0(), matchMulOBy2(), matchMulOfVScale(), matchNarrowBinop(), matchNarrowBinopFeedingAnd(), matchNonNegZext(), matchNotCmp(), matchOperandIsKnownToBeAPowerOfTwo(), matchOrShiftToFunnelShift(), matchOverlappingAnd(), matchPtrAddImmedChain(), matchPtrAddZero(), matchReassocConstantInnerLHS(), matchReassocConstantInnerRHS(), matchReassocFoldConstantsInSubTree(), matchReassocPtrAdd(), matchRedundantAnd(), matchRedundantBinOpInEquality(), matchRedundantNegOperands(), matchRedundantOr(), matchRedundantSExtInReg(), matchRedundantSextInReg(), matchRepeatedFPDivisor(), matchRotateOutOfRange(), matchSDivOrSRemByConst(), matchSelectIMinMax(), matchSelectSameVal(), llvm::SPIRVCombinerHelper::matchSelectToFaceForward(), matchSextInRegOfLoad(), matchSextOfTrunc(), matchSextTruncSextLoad(), matchShiftImmedChain(), matchShiftOfShiftedLogic(), matchShiftsTooBig(), matchShlOfVScale(), matchShuffleDisjointMask(), matchShuffleUndefRHS(), matchSimplifyAddToSub(), matchSimplifyNegMinMax(), matchSimplifySelectToMinMax(), matchSubAddSameReg(), matchSuboCarryOut(), matchSubOfVScale(), matchTruncateOfExt(), matchTruncBuildVectorFold(), matchTruncLshrBuildVectorFold(), matchTruncSSatS(), matchTruncSSatU(), matchTruncUSatU(), matchTruncUSatUToFPTOUISat(), matchUDivOrURemByConst(), matchUMulHToLShr(), matchUndefSelectCmp(), matchUndefStore(), matchUnmergeValuesAnyExtBuildVector(), matchUseVectorTruncate(), matchXorOfAndWithSameReg(), matchZextOfTrunc(), replaceRegOpWith(), replaceRegWith(), replaceSingleDefInstWithOperand(), replaceSingleDefInstWithReg(), setRegBank(), and tryReassocBinOp().

◆ Observer

◆ RBI

const RegisterBankInfo* llvm::CombinerHelper::RBI
protected

Definition at line 125 of file CombinerHelper.h.

Referenced by CombinerHelper(), getRBI(), and getRegBank().

◆ TII

const TargetInstrInfo* llvm::CombinerHelper::TII
protected

Definition at line 124 of file CombinerHelper.h.

Referenced by CombinerHelper(), and getTII().

◆ TRI

const TargetRegisterInfo* llvm::CombinerHelper::TRI
protected

◆ VT


The documentation for this class was generated from the following files: