Thanks to visit codestin.com
Credit goes to llvm.org

LLVM 22.0.0git
llvm::CombinerHelper Class Reference

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

Inheritance diagram for llvm::CombinerHelper:
[legend]

Public Member Functions

 CombinerHelper (GISelChangeObserver &Observer, MachineIRBuilder &B, bool IsPreLegalize, GISelValueTracking *VT=nullptr, MachineDominatorTree *MDT=nullptr, const LegalizerInfo *LI=nullptr)
GISelValueTrackinggetValueTracking () const
MachineIRBuildergetBuilder () const
const TargetLoweringgetTargetLowering () const
const MachineFunctiongetMachineFunction () const
const DataLayoutgetDataLayout () const
LLVMContextgetContext () const
bool isPreLegalize () const
bool isLegal (const LegalityQuery &Query) const
bool isLegalOrBeforeLegalizer (const LegalityQuery &Query) const
bool isLegalOrHasWidenScalar (const LegalityQuery &Query) const
bool isConstantLegalOrBeforeLegalizer (const LLT Ty) const
void replaceRegWith (MachineRegisterInfo &MRI, Register FromReg, Register ToReg) const
 MachineRegisterInfo::replaceRegWith() and inform the observer of the changes.
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.
void replaceOpcodeWith (MachineInstr &FromMI, unsigned ToOpcode) const
 Replace the opcode in instruction with a new opcode and inform the observer of the changes.
const RegisterBankgetRegBank (Register Reg) const
 Get the register bank of Reg.
void setRegBank (Register Reg, const RegisterBank *RegBank) const
 Set the register bank of Reg.
bool tryCombineCopy (MachineInstr &MI) const
 If MI is COPY, try to combine it.
bool matchCombineCopy (MachineInstr &MI) const
void applyCombineCopy (MachineInstr &MI) const
bool isPredecessor (const MachineInstr &DefMI, const MachineInstr &UseMI) const
 Returns true if DefMI precedes UseMI or they are the same instruction.
bool dominates (const MachineInstr &DefMI, const MachineInstr &UseMI) const
 Returns true if DefMI dominates UseMI.
bool tryCombineExtendingLoads (MachineInstr &MI) const
 If MI is extend that consumes the result of a load, try to combine it.
bool matchCombineExtendingLoads (MachineInstr &MI, PreferredTuple &MatchInfo) const
void applyCombineExtendingLoads (MachineInstr &MI, PreferredTuple &MatchInfo) const
bool matchCombineLoadWithAndMask (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Match (and (load x), mask) -> zextload x.
bool matchCombineExtractedVectorLoad (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Combine a G_EXTRACT_VECTOR_ELT of a load into a narrowed load.
bool matchCombineIndexedLoadStore (MachineInstr &MI, IndexedLoadStoreMatchInfo &MatchInfo) const
void applyCombineIndexedLoadStore (MachineInstr &MI, IndexedLoadStoreMatchInfo &MatchInfo) const
bool matchSextTruncSextLoad (MachineInstr &MI) const
void applySextTruncSextLoad (MachineInstr &MI) const
bool matchSextInRegOfLoad (MachineInstr &MI, std::tuple< Register, unsigned > &MatchInfo) const
 Match sext_inreg(load p), imm -> sextload p.
void applySextInRegOfLoad (MachineInstr &MI, std::tuple< Register, unsigned > &MatchInfo) const
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.
void applyCombineDivRem (MachineInstr &MI, MachineInstr *&OtherMI) const
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.
void applyOptBrCondByInvertingCond (MachineInstr &MI, MachineInstr *&BrCond) const
bool matchCombineConcatVectors (MachineInstr &MI, SmallVector< Register > &Ops) const
 If MI is G_CONCAT_VECTORS, try to combine it.
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.
bool matchCombineShuffleConcat (MachineInstr &MI, SmallVector< Register > &Ops) const
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.
bool matchCombineShuffleToBuildVector (MachineInstr &MI) const
 Replace MI with a build_vector.
void applyCombineShuffleToBuildVector (MachineInstr &MI) const
bool tryCombineShuffleVector (MachineInstr &MI) const
 Try to combine G_SHUFFLE_VECTOR into G_CONCAT_VECTORS.
bool matchCombineShuffleVector (MachineInstr &MI, SmallVectorImpl< Register > &Ops) const
 Check if the G_SHUFFLE_VECTOR MI can be replaced by a concat_vectors.
void applyCombineShuffleVector (MachineInstr &MI, const ArrayRef< Register > Ops) const
 Replace MI with a concat_vectors with Ops.
bool matchShuffleToExtract (MachineInstr &MI) const
void applyShuffleToExtract (MachineInstr &MI) const
bool tryCombineMemCpyFamily (MachineInstr &MI, unsigned MaxLen=0) const
 Optimize memcpy intrinsics et al, e.g.
bool matchPtrAddImmedChain (MachineInstr &MI, PtrAddChain &MatchInfo) const
void applyPtrAddImmedChain (MachineInstr &MI, PtrAddChain &MatchInfo) const
bool matchShiftImmedChain (MachineInstr &MI, RegisterImmPair &MatchInfo) const
 Fold (shift (shift base, x), y) -> (shift base (x+y))
void applyShiftImmedChain (MachineInstr &MI, RegisterImmPair &MatchInfo) const
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.
void applyShiftOfShiftedLogic (MachineInstr &MI, ShiftOfShiftedLogic &MatchInfo) const
bool matchCommuteShift (MachineInstr &MI, BuildFnTy &MatchInfo) const
bool matchLshrOfTruncOfLshr (MachineInstr &MI, LshrOfTruncOfLshr &MatchInfo, MachineInstr &ShiftMI) const
 Fold (lshr (trunc (lshr x, C1)), C2) -> trunc (shift x, (C1 + C2))
void applyLshrOfTruncOfLshr (MachineInstr &MI, LshrOfTruncOfLshr &MatchInfo) const
bool matchCombineMulToShl (MachineInstr &MI, unsigned &ShiftVal) const
 Transform a multiply by a power-of-2 value to a left shift.
void applyCombineMulToShl (MachineInstr &MI, unsigned &ShiftVal) const
bool matchCombineSubToAdd (MachineInstr &MI, BuildFnTy &MatchInfo) const
bool matchCombineShlOfExtend (MachineInstr &MI, RegisterImmPair &MatchData) const
void applyCombineShlOfExtend (MachineInstr &MI, const RegisterImmPair &MatchData) const
bool matchCombineMergeUnmerge (MachineInstr &MI, Register &MatchInfo) const
 Fold away a merge of an unmerge of the corresponding values.
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.
void applyCombineShiftToUnmerge (MachineInstr &MI, const unsigned &ShiftVal) const
bool tryCombineShiftToUnmerge (MachineInstr &MI, unsigned TargetShiftAmount) const
bool matchCombineUnmergeMergeToPlainValues (MachineInstr &MI, SmallVectorImpl< Register > &Operands) const
 Transform <ty,...> G_UNMERGE(G_MERGE ty X, Y, Z) -> ty X, Y, Z.
void applyCombineUnmergeMergeToPlainValues (MachineInstr &MI, SmallVectorImpl< Register > &Operands) const
bool matchCombineUnmergeConstant (MachineInstr &MI, SmallVectorImpl< APInt > &Csts) const
 Transform G_UNMERGE Constant -> Constant1, Constant2, ...
void applyCombineUnmergeConstant (MachineInstr &MI, SmallVectorImpl< APInt > &Csts) const
bool matchCombineUnmergeUndef (MachineInstr &MI, std::function< void(MachineIRBuilder &)> &MatchInfo) const
 Transform G_UNMERGE G_IMPLICIT_DEF -> G_IMPLICIT_DEF, G_IMPLICIT_DEF, ...
bool matchCombineUnmergeWithDeadLanesToTrunc (MachineInstr &MI) const
 Transform X, Y<dead> = G_UNMERGE Z -> X = G_TRUNC Z.
void applyCombineUnmergeWithDeadLanesToTrunc (MachineInstr &MI) const
bool matchCombineUnmergeZExtToZExt (MachineInstr &MI) const
 Transform X, Y = G_UNMERGE(G_ZEXT(Z)) -> X = G_ZEXT(Z); Y = G_CONSTANT 0.
void applyCombineUnmergeZExtToZExt (MachineInstr &MI) const
void applyCombineConstantFoldFpUnary (MachineInstr &MI, const ConstantFP *Cst) const
 Transform fp_instr(cst) to constant result of the fp operation.
bool matchCombineI2PToP2I (MachineInstr &MI, Register &Reg) const
 Transform IntToPtr(PtrToInt(x)) to x if cast is in the same address space.
void applyCombineI2PToP2I (MachineInstr &MI, Register &Reg) const
void applyCombineP2IToI2P (MachineInstr &MI, Register &Reg) const
 Transform PtrToInt(IntToPtr(x)) to x.
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)
void applyCombineAddP2IToPtrAdd (MachineInstr &MI, std::pair< Register, bool > &PtrRegAndCommute) const
bool matchCombineConstPtrAddToI2P (MachineInstr &MI, APInt &NewCst) const
void applyCombineConstPtrAddToI2P (MachineInstr &MI, APInt &NewCst) const
bool matchCombineAnyExtTrunc (MachineInstr &MI, Register &Reg) const
 Transform anyext(trunc(x)) to x.
bool matchCombineZextTrunc (MachineInstr &MI, Register &Reg) const
 Transform zext(trunc(x)) to x.
bool matchCombineTruncOfShift (MachineInstr &MI, std::pair< MachineInstr *, LLT > &MatchInfo) const
 Transform trunc (shl x, K) to shl (trunc x), K if K < VT.getScalarSizeInBits().
void applyCombineTruncOfShift (MachineInstr &MI, std::pair< MachineInstr *, LLT > &MatchInfo) const
bool matchAnyExplicitUseIsUndef (MachineInstr &MI) const
 Return true if any explicit use operand on MI is defined by a G_IMPLICIT_DEF.
bool matchAllExplicitUsesAreUndef (MachineInstr &MI) const
 Return true if all register explicit use operands on MI are defined by a G_IMPLICIT_DEF.
bool matchUndefShuffleVectorMask (MachineInstr &MI) const
 Return true if a G_SHUFFLE_VECTOR instruction MI has an undef mask.
bool matchUndefStore (MachineInstr &MI) const
 Return true if a G_STORE instruction MI is storing an undef value.
bool matchUndefSelectCmp (MachineInstr &MI) const
 Return true if a G_SELECT instruction MI has an undef comparison.
bool matchInsertExtractVecEltOutOfBounds (MachineInstr &MI) const
 Return true if a G_{EXTRACT,INSERT}_VECTOR_ELT has an out of range index.
bool matchConstantSelectCmp (MachineInstr &MI, unsigned &OpIdx) const
 Return true if a G_SELECT instruction MI has a constant comparison.
void replaceInstWithFConstant (MachineInstr &MI, double C) const
 Replace an instruction with a G_FCONSTANT with value C.
void replaceInstWithFConstant (MachineInstr &MI, ConstantFP *CFP) const
 Replace an instruction with an G_FCONSTANT with value CFP.
void replaceInstWithConstant (MachineInstr &MI, int64_t C) const
 Replace an instruction with a G_CONSTANT with value C.
void replaceInstWithConstant (MachineInstr &MI, APInt C) const
 Replace an instruction with a G_CONSTANT with value C.
void replaceInstWithUndef (MachineInstr &MI) const
 Replace an instruction with a G_IMPLICIT_DEF.
void replaceSingleDefInstWithOperand (MachineInstr &MI, unsigned OpIdx) const
 Delete MI and replace all of its uses with its OpIdx-th operand.
void replaceSingleDefInstWithReg (MachineInstr &MI, Register Replacement) const
 Delete MI and replace all of its uses with Replacement.
void applyFunnelShiftConstantModulo (MachineInstr &MI) const
 Replaces the shift amount in MI with ShiftAmt % BW.
bool matchEqualDefs (const MachineOperand &MOP1, const MachineOperand &MOP2) const
 Return true if MOP1 and MOP2 are register operands are defined by equivalent instructions.
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.
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.
bool matchConstantLargerBitWidth (MachineInstr &MI, unsigned ConstIdx) const
 Checks if constant at ConstIdx is larger than MI 's bitwidth.
bool matchSelectSameVal (MachineInstr &MI) const
 Optimize (cond ? x : x) -> x.
bool matchBinOpSameVal (MachineInstr &MI) const
 Optimize (x op x) -> x.
bool matchOperandIsZero (MachineInstr &MI, unsigned OpIdx) const
 Check if operand OpIdx is zero.
bool matchOperandIsUndef (MachineInstr &MI, unsigned OpIdx) const
 Check if operand OpIdx is undef.
bool matchOperandIsKnownToBeAPowerOfTwo (MachineInstr &MI, unsigned OpIdx) const
 Check if operand OpIdx is known to be a power of 2.
void eraseInst (MachineInstr &MI) const
 Erase MI.
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.
void applySimplifyAddToSub (MachineInstr &MI, std::tuple< Register, Register > &MatchInfo) const
bool matchHoistLogicOpWithSameOpcodeHands (MachineInstr &MI, InstructionStepsMatchInfo &MatchInfo) const
 Match (logic_op (op x...), (op y...)) -> (op (logic_op x, y))
void applyBuildInstructionSteps (MachineInstr &MI, InstructionStepsMatchInfo &MatchInfo) const
 Replace MI with a series of instructions described in MatchInfo.
bool matchAshrShlToSextInreg (MachineInstr &MI, std::tuple< Register, int64_t > &MatchInfo) const
 Match ashr (shl x, C), C -> sext_inreg (C)
void applyAshShlToSextInreg (MachineInstr &MI, std::tuple< Register, int64_t > &MatchInfo) const
bool matchOverlappingAnd (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Fold and(and(x, C1), C2) -> C1&C2 ? and(x, C1&C2) : 0.
bool matchRedundantAnd (MachineInstr &MI, Register &Replacement) const
bool matchRedundantOr (MachineInstr &MI, Register &Replacement) const
bool matchRedundantSExtInReg (MachineInstr &MI) const
bool matchNotCmp (MachineInstr &MI, SmallVectorImpl< Register > &RegsToNegate) const
 Combine inverting a result of a compare into the opposite cond code.
void applyNotCmp (MachineInstr &MI, SmallVectorImpl< Register > &RegsToNegate) const
bool matchXorOfAndWithSameReg (MachineInstr &MI, std::pair< Register, Register > &MatchInfo) const
 Fold (xor (and x, y), y) -> (and (not x), y) {.
void applyXorOfAndWithSameReg (MachineInstr &MI, std::pair< Register, Register > &MatchInfo) const
bool matchPtrAddZero (MachineInstr &MI) const
 }
void applyPtrAddZero (MachineInstr &MI) const
void applySimplifyURemByPow2 (MachineInstr &MI) const
 Combine G_UREM x, (known power of 2) to an add and bitmasking.
bool matchFoldBinOpIntoSelect (MachineInstr &MI, unsigned &SelectOpNo) const
 Push a binary operator through a select on constants.
void applyFoldBinOpIntoSelect (MachineInstr &MI, const unsigned &SelectOpNo) const
 SelectOperand is the operand in binary operator MI that is the select to fold.
bool matchCombineInsertVecElts (MachineInstr &MI, SmallVectorImpl< Register > &MatchInfo) const
void applyCombineInsertVecElts (MachineInstr &MI, SmallVectorImpl< Register > &MatchInfo) const
bool matchLoadOrCombine (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Match expression trees of the form.
bool matchExtendThroughPhis (MachineInstr &MI, MachineInstr *&ExtMI) const
void applyExtendThroughPhis (MachineInstr &MI, MachineInstr *&ExtMI) const
bool matchExtractVecEltBuildVec (MachineInstr &MI, Register &Reg) const
void applyExtractVecEltBuildVec (MachineInstr &MI, Register &Reg) const
bool matchExtractAllEltsFromBuildVector (MachineInstr &MI, SmallVectorImpl< std::pair< Register, MachineInstr * > > &MatchInfo) const
void applyExtractAllEltsFromBuildVector (MachineInstr &MI, SmallVectorImpl< std::pair< Register, MachineInstr * > > &MatchInfo) const
void applyBuildFn (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Use a function which takes in a MachineIRBuilder to perform a combine.
void applyBuildFnNoErase (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Use a function which takes in a MachineIRBuilder to perform a combine.
bool matchOrShiftToFunnelShift (MachineInstr &MI, BuildFnTy &MatchInfo) const
bool matchFunnelShiftToRotate (MachineInstr &MI) const
 Match an FSHL or FSHR that can be combined to a ROTR or ROTL rotate.
void applyFunnelShiftToRotate (MachineInstr &MI) const
bool matchRotateOutOfRange (MachineInstr &MI) const
void applyRotateOutOfRange (MachineInstr &MI) const
bool matchUseVectorTruncate (MachineInstr &MI, Register &MatchInfo) const
void applyUseVectorTruncate (MachineInstr &MI, Register &MatchInfo) const
bool matchICmpToTrueFalseKnownBits (MachineInstr &MI, int64_t &MatchInfo) const
bool matchICmpToLHSKnownBits (MachineInstr &MI, BuildFnTy &MatchInfo) const
bool matchAndOrDisjointMask (MachineInstr &MI, BuildFnTy &MatchInfo) const
bool matchBitfieldExtractFromSExtInReg (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Form a G_SBFX from a G_SEXT_INREG fed by a right shift.
bool matchBitfieldExtractFromAnd (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Match: and (lshr x, cst), mask -> ubfx x, cst, width.
bool matchBitfieldExtractFromShr (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Match: shr (shl x, n), k -> sbfx/ubfx x, pos, width.
bool matchBitfieldExtractFromShrAnd (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Match: shr (and x, n), k -> ubfx x, pos, width.
bool matchReassocConstantInnerRHS (GPtrAdd &MI, MachineInstr *RHS, BuildFnTy &MatchInfo) const
bool matchReassocFoldConstantsInSubTree (GPtrAdd &MI, MachineInstr *LHS, MachineInstr *RHS, BuildFnTy &MatchInfo) const
bool matchReassocConstantInnerLHS (GPtrAdd &MI, MachineInstr *LHS, MachineInstr *RHS, BuildFnTy &MatchInfo) const
bool matchReassocPtrAdd (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Reassociate pointer calculations with G_ADD involved, to allow better addressing mode usage.
bool tryReassocBinOp (unsigned Opc, Register DstReg, Register Op0, Register Op1, BuildFnTy &MatchInfo) const
 Try to reassociate to reassociate operands of a commutative binop.
bool matchReassocCommBinOp (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Reassociate commutative binary operations like G_ADD.
bool matchConstantFoldCastOp (MachineInstr &MI, APInt &MatchInfo) const
 Do constant folding when opportunities are exposed after MIR building.
bool matchConstantFoldBinOp (MachineInstr &MI, APInt &MatchInfo) const
 Do constant folding when opportunities are exposed after MIR building.
bool matchConstantFoldFPBinOp (MachineInstr &MI, ConstantFP *&MatchInfo) const
 Do constant FP folding when opportunities are exposed after MIR building.
bool matchConstantFoldFMA (MachineInstr &MI, ConstantFP *&MatchInfo) const
 Constant fold G_FMA/G_FMAD.
bool matchNarrowBinopFeedingAnd (MachineInstr &MI, BuildFnTy &MatchInfo) const
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.
bool matchUDivOrURemByConst (MachineInstr &MI) const
 Combine G_UDIV or G_UREM by constant into a multiply by magic constant.
void applyUDivOrURemByConst (MachineInstr &MI) const
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.
bool matchSDivOrSRemByConst (MachineInstr &MI) const
 Combine G_SDIV or G_SREM by constant into a multiply by magic constant.
void applySDivOrSRemByConst (MachineInstr &MI) const
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.
void applySDivByPow2 (MachineInstr &MI) const
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.
bool matchUMulHToLShr (MachineInstr &MI) const
void applyUMulHToLShr (MachineInstr &MI) const
bool matchTruncSSatS (MachineInstr &MI, Register &MatchInfo) const
void applyTruncSSatS (MachineInstr &MI, Register &MatchInfo) const
bool matchTruncSSatU (MachineInstr &MI, Register &MatchInfo) const
void applyTruncSSatU (MachineInstr &MI, Register &MatchInfo) const
bool matchTruncUSatU (MachineInstr &MI, MachineInstr &MinMI) const
bool matchTruncUSatUToFPTOUISat (MachineInstr &MI, MachineInstr &SrcMI) const
bool tryCombine (MachineInstr &MI) const
 Try to transform MI by using all of the above combine functions.
bool tryEmitMemcpyInline (MachineInstr &MI) const
 Emit loads and stores that perform the given memcpy.
bool matchMulOBy2 (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Match: (G_UMULO x, 2) -> (G_UADDO x, x) (G_SMULO x, 2) -> (G_SADDO x, x)
bool matchMulOBy0 (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Match: (G_*MULO x, 0) -> 0 + no carry out.
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)
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)
bool matchFsubToFneg (MachineInstr &MI, Register &MatchInfo) const
void applyFsubToFneg (MachineInstr &MI, Register &MatchInfo) const
bool canCombineFMadOrFMA (MachineInstr &MI, bool &AllowFusionGlobally, bool &HasFMAD, bool &Aggressive, bool CanReassociate=false) const
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)
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)
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))
bool matchCombineFAddFpExtFMulToFMadOrFMAAggressive (MachineInstr &MI, BuildFnTy &MatchInfo) const
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)
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))
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))
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))
bool matchCombineFMinMaxNaN (MachineInstr &MI, unsigned &Info) const
bool matchAddSubSameReg (MachineInstr &MI, Register &Src) const
 Transform G_ADD(x, G_SUB(y, x)) to y.
bool matchBuildVectorIdentityFold (MachineInstr &MI, Register &MatchInfo) const
bool matchTruncBuildVectorFold (MachineInstr &MI, Register &MatchInfo) const
bool matchTruncLshrBuildVectorFold (MachineInstr &MI, Register &MatchInfo) const
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.
bool matchSimplifySelectToMinMax (MachineInstr &MI, BuildFnTy &MatchInfo) const
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.
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).
bool matchCommuteConstantToRHS (MachineInstr &MI) const
 Match constant LHS ops that should be commuted.
bool matchSextOfTrunc (const MachineOperand &MO, BuildFnTy &MatchInfo) const
 Combine sext of trunc.
bool matchZextOfTrunc (const MachineOperand &MO, BuildFnTy &MatchInfo) const
 Combine zext of trunc.
bool matchNonNegZext (const MachineOperand &MO, BuildFnTy &MatchInfo) const
 Combine zext nneg to sext.
bool matchCommuteFPConstantToRHS (MachineInstr &MI) const
 Match constant LHS FP ops that should be commuted.
void applyCommuteBinOpOperands (MachineInstr &MI) const
bool matchSelectIMinMax (const MachineOperand &MO, BuildFnTy &MatchInfo) const
 Combine select to integer min/max.
bool matchSimplifyNegMinMax (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Tranform (neg (min/max x, (neg x))) into (max/min x, (neg x)).
bool matchSelect (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Combine selects.
bool matchAnd (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Combine ands.
bool matchOr (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Combine ors.
bool matchNarrowBinop (const MachineInstr &TruncMI, const MachineInstr &BinopMI, BuildFnTy &MatchInfo) const
 trunc (binop X, C) --> binop (trunc X, trunc C).
bool matchCastOfInteger (const MachineInstr &CastMI, APInt &MatchInfo) const
bool matchAddOverflow (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Combine addos.
bool matchExtractVectorElement (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Combine extract vector element.
bool matchExtractVectorElementWithBuildVector (const MachineInstr &MI, const MachineInstr &MI2, BuildFnTy &MatchInfo) const
 Combine extract vector element with a build vector on the vector register.
bool matchExtractVectorElementWithBuildVectorTrunc (const MachineOperand &MO, BuildFnTy &MatchInfo) const
 Combine extract vector element with a build vector trunc on the vector register.
bool matchExtractVectorElementWithShuffleVector (const MachineInstr &MI, const MachineInstr &MI2, BuildFnTy &MatchInfo) const
 Combine extract vector element with a shuffle vector on the vector register.
bool matchExtractVectorElementWithDifferentIndices (const MachineOperand &MO, BuildFnTy &MatchInfo) const
 Combine extract vector element with a insert vector element on the vector register and different indices.
bool matchShuffleUndefRHS (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Remove references to rhs if it is undef.
bool matchShuffleDisjointMask (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Turn shuffle a, b, mask -> shuffle undef, b, mask iff mask does not reference a.
void applyBuildFnMO (const MachineOperand &MO, BuildFnTy &MatchInfo) const
 Use a function which takes in a MachineIRBuilder to perform a combine.
bool matchFPowIExpansion (MachineInstr &MI, int64_t Exponent) const
 Match FPOWI if it's safe to extend it into a series of multiplications.
void applyExpandFPowI (MachineInstr &MI, int64_t Exponent) const
 Expands FPOWI into a series of multiplications and a division if the exponent is negative.
bool matchInsertVectorElementOOB (MachineInstr &MI, BuildFnTy &MatchInfo) const
 Combine insert vector element OOB.
bool matchFreezeOfSingleMaybePoisonOperand (MachineInstr &MI, BuildFnTy &MatchInfo) const
bool matchAddOfVScale (const MachineOperand &MO, BuildFnTy &MatchInfo) const
bool matchMulOfVScale (const MachineOperand &MO, BuildFnTy &MatchInfo) const
bool matchSubOfVScale (const MachineOperand &MO, BuildFnTy &MatchInfo) const
bool matchShlOfVScale (const MachineOperand &MO, BuildFnTy &MatchInfo) const
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).
bool matchCastOfSelect (const MachineInstr &Cast, const MachineInstr &SelectMI, BuildFnTy &MatchInfo) const
bool matchFoldAPlusC1MinusC2 (const MachineInstr &MI, BuildFnTy &MatchInfo) const
bool matchFoldC2MinusAPlusC1 (const MachineInstr &MI, BuildFnTy &MatchInfo) const
bool matchFoldAMinusC1MinusC2 (const MachineInstr &MI, BuildFnTy &MatchInfo) const
bool matchFoldC1Minus2MinusC2 (const MachineInstr &MI, BuildFnTy &MatchInfo) const
bool matchFoldAMinusC1PlusC2 (const MachineInstr &MI, BuildFnTy &MatchInfo) const
bool matchExtOfExt (const MachineInstr &FirstMI, const MachineInstr &SecondMI, BuildFnTy &MatchInfo) const
bool matchCastOfBuildVector (const MachineInstr &CastMI, const MachineInstr &BVMI, BuildFnTy &MatchInfo) const
bool matchCanonicalizeICmp (const MachineInstr &MI, BuildFnTy &MatchInfo) const
bool matchCanonicalizeFCmp (const MachineInstr &MI, BuildFnTy &MatchInfo) const
bool matchUnmergeValuesAnyExtBuildVector (const MachineInstr &MI, BuildFnTy &MatchInfo) const
bool matchMergeXAndUndef (const MachineInstr &MI, BuildFnTy &MatchInfo) const
bool matchMergeXAndZero (const MachineInstr &MI, BuildFnTy &MatchInfo) const
bool matchSuboCarryOut (const MachineInstr &MI, BuildFnTy &MatchInfo) const
bool matchRedundantSextInReg (MachineInstr &Root, MachineInstr &Other, BuildFnTy &MatchInfo) const

Protected Attributes

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

Detailed Description

Definition at line 114 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, TRI, and VT.

Member Function Documentation

◆ applyAshShlToSextInreg()

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

Definition at line 3361 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 4461 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 7987 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 4468 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 3329 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 2643 of file CombinerHelper.cpp.

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

◆ 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 372 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 1761 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 2682 of file CombinerHelper.cpp.

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

◆ applyCombineCopy()

void CombinerHelper::applyCombineCopy ( MachineInstr & MI) const

Definition at line 237 of file CombinerHelper.cpp.

References MI, MRI, and replaceRegWith().

Referenced by tryCombineCopy().

◆ applyCombineDivRem()

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

◆ applyCombineExtendingLoads()

◆ applyCombineI2PToP2I()

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

Definition at line 2602 of file CombinerHelper.cpp.

References assert(), Builder, and MI.

◆ applyCombineIndexedLoadStore()

◆ applyCombineInsertVecElts()

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

Definition at line 3195 of file CombinerHelper.cpp.

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

◆ applyCombineMulToShl()

◆ applyCombineP2IToI2P()

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

Transform PtrToInt(IntToPtr(x)) to x.

Definition at line 2610 of file CombinerHelper.cpp.

References assert(), Builder, and MI.

◆ applyCombineShiftToUnmerge()

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

Definition at line 2509 of file CombinerHelper.cpp.

References assert(), Builder, llvm::Hi, llvm::Lo, MI, MRI, llvm::LLT::scalar(), and Size.

Referenced by tryCombineShiftToUnmerge().

◆ 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 496 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,
const ArrayRef< Register > Ops ) const

Replace MI with a concat_vectors with Ops.

Definition at line 607 of file CombinerHelper.cpp.

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

Referenced by tryCombineShuffleVector().

◆ 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 2317 of file CombinerHelper.cpp.

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

◆ applyCombineUnmergeWithDeadLanesToTrunc()

void CombinerHelper::applyCombineUnmergeWithDeadLanesToTrunc ( MachineInstr & MI) const

Definition at line 2418 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 7094 of file CombinerHelper.cpp.

References MI, and Observer.

◆ 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 8000 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 4449 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 3872 of file CombinerHelper.cpp.

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

◆ applyFsubToFneg()

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

Definition at line 6150 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 3037 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 4540 of file CombinerHelper.cpp.

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

◆ applyLshrOfTruncOfLshr()

◆ applyNotCmp()

◆ applyOptBrCondByInvertingCond()

◆ applyPtrAddImmedChain()

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

◆ applyPtrAddZero()

void CombinerHelper::applyPtrAddZero ( MachineInstr & MI) const

Definition at line 3798 of file CombinerHelper.cpp.

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

◆ applyRotateOutOfRange()

void CombinerHelper::applyRotateOutOfRange ( MachineInstr & MI) const

Definition at line 4567 of file CombinerHelper.cpp.

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

◆ applySDivByPow2()

◆ applySDivOrSRemByConst()

void CombinerHelper::applySDivOrSRemByConst ( MachineInstr & MI) const

Definition at line 5715 of file CombinerHelper.cpp.

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

◆ applySextInRegOfLoad()

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

◆ applySextTruncSextLoad()

void CombinerHelper::applySextTruncSextLoad ( MachineInstr & MI) const

Definition at line 1088 of file CombinerHelper.cpp.

References assert(), Builder, and MI.

◆ applyShiftImmedChain()

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

◆ applyShiftOfShiftedLogic()

◆ applyShuffleToExtract()

void CombinerHelper::applyShuffleToExtract ( MachineInstr & MI) const

Definition at line 630 of file CombinerHelper.cpp.

References Builder, I, MI, and MRI.

◆ applySimplifyAddToSub()

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

Definition at line 3213 of file CombinerHelper.cpp.

References Builder, and MI.

◆ 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 3805 of file CombinerHelper.cpp.

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

◆ applyTruncSSatS()

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

Definition at line 6014 of file CombinerHelper.cpp.

References Builder, and MI.

◆ applyTruncSSatU()

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

Definition at line 6046 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 5939 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 5662 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 3766 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 1049 of file CombinerHelper.cpp.

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

Referenced by applyCombineDivRem().

◆ eraseInst()

void CombinerHelper::eraseInst ( MachineInstr & MI) const

Erase MI.

Definition at line 2884 of file CombinerHelper.cpp.

References MI.

Referenced by applyCombineTruncOfShift(), and applyFsubToFneg().

◆ getBuilder()

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

Definition at line 134 of file CombinerHelper.h.

References Builder.

◆ getContext()

LLVMContext & CombinerHelper::getContext ( ) const

Definition at line 81 of file CombinerHelper.cpp.

References Builder.

◆ getDataLayout()

const DataLayout & CombinerHelper::getDataLayout ( ) const

◆ getMachineFunction()

const MachineFunction & CombinerHelper::getMachineFunction ( ) const

Definition at line 73 of file CombinerHelper.cpp.

References Builder.

Referenced by getDataLayout().

◆ 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 213 of file CombinerHelper.cpp.

References MRI, RBI, and TRI.

Referenced by matchPtrAddImmedChain().

◆ getTargetLowering()

◆ getValueTracking()

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

Definition at line 132 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 170 of file CombinerHelper.cpp.

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

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

◆ isLegal()

◆ isLegalOrBeforeLegalizer()

◆ 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 165 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 1033 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 153 of file CombinerHelper.cpp.

References IsPreLegalize.

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

◆ 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 5367 of file CombinerHelper.cpp.

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

◆ matchAddOfVScale()

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

◆ 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 6748 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 2831 of file CombinerHelper.cpp.

References llvm::all_of(), and MI.

◆ matchAnd()

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

Combine ands.

Definition at line 7795 of file CombinerHelper.cpp.

References llvm::cast(), and MI.

◆ matchAndOrDisjointMask()

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

◆ matchAnyExplicitUseIsUndef()

bool CombinerHelper::matchAnyExplicitUseIsUndef ( MachineInstr & MI) const

Return true if any explicit use operand on MI is defined by a G_IMPLICIT_DEF.

Definition at line 2824 of file CombinerHelper.cpp.

References llvm::any_of(), and MI.

◆ matchAshrShlToSextInreg()

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

◆ matchBinOpSameVal()

bool CombinerHelper::matchBinOpSameVal ( MachineInstr & MI) const

Optimize (x op x) -> x.

Definition at line 3069 of file CombinerHelper.cpp.

References llvm::canReplaceReg(), matchEqualDefs(), 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 4735 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 4705 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 4772 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 4822 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 2618 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()

◆ 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 314 of file CombinerHelper.cpp.

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

◆ matchCombineConstPtrAddToI2P()

◆ matchCombineCopy()

bool CombinerHelper::matchCombineCopy ( MachineInstr & MI) const

Definition at line 230 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 1545 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 6314 of file CombinerHelper.cpp.

References llvm::Aggressive, assert(), B(), canCombineFMadOrFMA(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), hasMoreUses(), isContractableFMul(), MI, MRI, std::swap(), 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 6205 of file CombinerHelper.cpp.

References llvm::Aggressive, assert(), B(), canCombineFMadOrFMA(), hasMoreUses(), isContractableFMul(), MI, 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 6254 of file CombinerHelper.cpp.

References llvm::Aggressive, assert(), B(), canCombineFMadOrFMA(), 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 6507 of file CombinerHelper.cpp.

References llvm::Aggressive, assert(), B(), canCombineFMadOrFMA(), hasMoreUses(), isContractableFMul(), MI, 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 6560 of file CombinerHelper.cpp.

References llvm::Aggressive, assert(), B(), canCombineFMadOrFMA(), 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 6608 of file CombinerHelper.cpp.

References llvm::Aggressive, assert(), B(), canCombineFMadOrFMA(), 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 6660 of file CombinerHelper.cpp.

References llvm::Aggressive, assert(), B(), canCombineFMadOrFMA(), 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.

◆ matchCombineI2PToP2I()

bool CombinerHelper::matchCombineI2PToP2I ( MachineInstr & MI,
Register & Reg ) const

Transform IntToPtr(PtrToInt(x)) to x if cast is in the same address space.

Definition at line 2592 of file CombinerHelper.cpp.

References assert(), llvm::MIPatternMatch::m_all_of(), llvm::MIPatternMatch::m_GPtrToInt(), llvm::MIPatternMatch::m_Reg(), llvm::MIPatternMatch::m_SpecificType(), MI, llvm::MIPatternMatch::mi_match(), and MRI.

◆ matchCombineIndexedLoadStore()

◆ matchCombineInsertVecElts()

◆ matchCombineLoadWithAndMask()

◆ matchCombineMergeUnmerge()

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

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

Definition at line 2266 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 2159 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 2484 of file CombinerHelper.cpp.

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

Referenced by tryCombineShiftToUnmerge().

◆ matchCombineShlOfExtend()

◆ matchCombineShuffleConcat()

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

◆ matchCombineShuffleToBuildVector()

bool CombinerHelper::matchCombineShuffleToBuildVector ( MachineInstr & MI) const

Replace MI with a build_vector.

Definition at line 394 of file CombinerHelper.cpp.

References assert(), llvm::cast(), llvm::LLT::isVector(), MI, and MRI.

◆ 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 531 of file CombinerHelper.cpp.

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

Referenced by tryCombineShuffleVector().

◆ 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 2738 of file CombinerHelper.cpp.

References assert(), llvm::getDefIgnoringCopies(), llvm::KnownBits::getMaxValue(), getMidVTForTruncRightShiftCombine(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), llvm::LLT::getScalarSizeInBits(), getTargetLowering(), isLegalOrBeforeLegalizer(), MI, MRI, llvm::APInt::uge(), llvm::APInt::ugt(), and VT.

◆ matchCombineUnmergeConstant()

◆ 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 2293 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 2388 of file CombinerHelper.cpp.

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

◆ matchCombineUnmergeWithDeadLanesToTrunc()

bool CombinerHelper::matchCombineUnmergeWithDeadLanesToTrunc ( MachineInstr & MI) const

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

Definition at line 2403 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 2426 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 7055 of file CombinerHelper.cpp.

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

◆ matchCommuteFPConstantToRHS()

bool CombinerHelper::matchCommuteFPConstantToRHS ( MachineInstr & MI) const

Match constant LHS FP ops that should be commuted.

Definition at line 7085 of file CombinerHelper.cpp.

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

◆ matchCommuteShift()

◆ matchConstantFoldBinOp()

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

Do constant folding when opportunities are exposed after MIR building.

Definition at line 5190 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 5177 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 5201 of file CombinerHelper.cpp.

References llvm::ConstantFoldFPBinOp(), 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 2993 of file CombinerHelper.cpp.

References llvm::CallingConv::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 3023 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 2983 of file CombinerHelper.cpp.

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

Referenced by matchOperandIsZero().

◆ 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 2873 of file CombinerHelper.cpp.

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

◆ 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 5866 of file CombinerHelper.cpp.

References assert(), llvm::CallingConv::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()

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

◆ matchFoldAMinusC1PlusC2()

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

Definition at line 8136 of file CombinerHelper.cpp.

References llvm::Add, B(), llvm::cast(), llvm::getIConstantFromReg(), MI, MRI, and llvm::Sub.

◆ matchFoldAPlusC1MinusC2()

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

Definition at line 8044 of file CombinerHelper.cpp.

References llvm::Add, B(), llvm::cast(), llvm::getIConstantFromReg(), MI, MRI, and llvm::Sub.

◆ 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 3818 of file CombinerHelper.cpp.

References llvm::isAllOnesOrAllOnesSplat(), llvm::isConstantOrConstantVector(), llvm::isNullOrNullSplat(), MI, MRI, and Select.

◆ matchFoldC1Minus2MinusC2()

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

◆ matchFoldC2MinusAPlusC1()

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

Definition at line 8067 of file CombinerHelper.cpp.

References llvm::Add, B(), llvm::cast(), llvm::getIConstantFromReg(), MI, MRI, and llvm::Sub.

◆ 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 7994 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 4528 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 4581 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 2856 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 5348 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 5329 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()

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

◆ matchNotCmp()

◆ matchOperandIsKnownToBeAPowerOfTwo()

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

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

Definition at line 3089 of file CombinerHelper.cpp.

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

◆ matchOperandIsUndef()

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

Check if operand OpIdx is undef.

Definition at line 3082 of file CombinerHelper.cpp.

References llvm::getOpcodeDef(), llvm::MachineOperand::getReg(), llvm::MachineOperand::isReg(), MI, MRI, and OpIdx.

◆ matchOperandIsZero()

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

Check if operand OpIdx is zero.

Definition at line 3075 of file CombinerHelper.cpp.

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

◆ 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 1640 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 7807 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 3373 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

}

Combine G_PTR_ADD with nullptr to G_INTTOPTR

Definition at line 3779 of file CombinerHelper.cpp.

References assert(), Builder, llvm::cast(), DL, llvm::getIConstantVRegVal(), llvm::isBuildVectorAllZeros(), MI, and MRI.

◆ matchReassocCommBinOp()

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

Reassociate commutative binary operations like G_ADD.

Definition at line 5161 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 5088 of file CombinerHelper.cpp.

References llvm::cast(), matchReassocConstantInnerLHS(), matchReassocConstantInnerRHS(), matchReassocFoldConstantsInSubTree(), MI, 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 3400 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 6967 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 6079 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 3456 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 3498 of file CombinerHelper.cpp.

References MI, MRI, and VT.

◆ matchRedundantSextInReg()

◆ matchRotateOutOfRange()

bool CombinerHelper::matchRotateOutOfRange ( MachineInstr & MI) const

◆ matchSDivOrSRemByConst()

◆ matchSelect()

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

Combine selects.

Definition at line 7545 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 3061 of file CombinerHelper.cpp.

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

◆ matchSextInRegOfLoad()

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

◆ matchSextOfTrunc()

◆ matchSextTruncSextLoad()

bool CombinerHelper::matchSextTruncSextLoad ( MachineInstr & MI) const

◆ matchShiftImmedChain()

bool CombinerHelper::matchShiftImmedChain ( MachineInstr & MI,
RegisterImmPair & MatchInfo ) const

◆ 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 1941 of file CombinerHelper.cpp.

References assert(), llvm::getIConstantVRegValWithLookThrough(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), llvm::ShiftOfShiftedLogic::Logic, llvm::ShiftOfShiftedLogic::LogicNonShiftReg, MI, 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 7035 of file CombinerHelper.cpp.

References llvm::CallingConv::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 8285 of file CombinerHelper.cpp.

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

◆ matchShuffleToExtract()

bool CombinerHelper::matchShuffleToExtract ( MachineInstr & MI) const

Definition at line 622 of file CombinerHelper.cpp.

References assert(), and MI.

◆ matchShuffleUndefRHS()

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

Remove references to rhs if it is undef.

Definition at line 8241 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 3128 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 6952 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

Transform trunc ([asz]ext x) to x or ([asz]ext x) or (trunc x).

Definition at line 137 of file CombinerHelperCasts.cpp.

References B(), llvm::cast(), llvm::GenericMachineInstr::getReg(), llvm::LLT::getScalarSizeInBits(), isLegalOrBeforeLegalizer(), and MRI.

◆ 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 2850 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 2838 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 2844 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 3735 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 3109 of file CombinerHelper.cpp.

References assert(), Builder, llvm::CallingConv::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 3102 of file CombinerHelper.cpp.

References assert(), Builder, llvm::CallingConv::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 3115 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 3095 of file CombinerHelper.cpp.

References assert(), Builder, llvm::CallingConv::C, and MI.

◆ replaceInstWithUndef()

void CombinerHelper::replaceInstWithUndef ( MachineInstr & MI) const

Replace an instruction with a G_IMPLICIT_DEF.

Definition at line 3122 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 204 of file CombinerHelper.cpp.

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

Referenced by 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 193 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 3004 of file CombinerHelper.cpp.

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

◆ replaceSingleDefInstWithReg()

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

Delete MI and replace all of its uses with Replacement.

Definition at line 3014 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 217 of file CombinerHelper.cpp.

References MRI.

Referenced by applyPtrAddImmedChain().

◆ tryCombine()

bool llvm::CombinerHelper::tryCombine ( MachineInstr & MI) const

Try to transform MI by using all of the above combine functions.

Returns true if changed.

References llvm::Aggressive, llvm::sampleprof::Base, llvm::Exponent, Info, MI, llvm::Offset, and llvm::Other.

◆ tryCombineCopy()

bool CombinerHelper::tryCombineCopy ( MachineInstr & MI) const

If MI is COPY, try to combine it.

Returns true if MI changed.

Definition at line 223 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 743 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 1707 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

◆ tryCombineShuffleVector()

bool CombinerHelper::tryCombineShuffleVector ( MachineInstr & MI) const

Try to combine G_SHUFFLE_VECTOR into G_CONCAT_VECTORS.

Returns true if MI changed.

Precondition
MI.getOpcode() == G_SHUFFLE_VECTOR.

Definition at line 522 of file CombinerHelper.cpp.

References AbstractManglingParser< Derived, Alloc >::Ops, applyCombineShuffleVector(), matchCombineShuffleVector(), and MI.

◆ tryEmitMemcpyInline()

bool CombinerHelper::tryEmitMemcpyInline ( MachineInstr & MI) const

Emit loads and stores that perform the given memcpy.

Assumes MI is a G_MEMCPY_INLINE TODO: implement dynamically sized inline memcpy, and rename: s/bool tryEmit/void emit/

Definition at line 1699 of file CombinerHelper.cpp.

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

◆ tryReassocBinOp()

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

Try to reassociate to reassociate operands of a commutative binop.

Definition at line 5120 of file CombinerHelper.cpp.

References B(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), getTargetLowering(), llvm::isConstantOrConstantSplatVector(), MRI, and Opc.

Referenced by matchReassocCommBinOp().

Member Data Documentation

◆ Builder

MachineIRBuilder& llvm::CombinerHelper::Builder
protected

Definition at line 116 of file CombinerHelper.h.

Referenced by applyAshShlToSextInreg(), applyBuildFnMO(), applyBuildFnNoErase(), applyBuildInstructionSteps(), applyCombineAddP2IToPtrAdd(), applyCombineConcatVectors(), applyCombineConstantFoldFpUnary(), applyCombineConstPtrAddToI2P(), applyCombineDivRem(), applyCombineExtendingLoads(), applyCombineI2PToP2I(), applyCombineIndexedLoadStore(), applyCombineInsertVecElts(), applyCombineP2IToI2P(), applyCombineShiftToUnmerge(), applyCombineShlOfExtend(), applyCombineShuffleConcat(), applyCombineShuffleToBuildVector(), applyCombineShuffleVector(), applyCombineTruncOfShift(), applyCombineUnmergeConstant(), applyCombineUnmergeMergeToPlainValues(), applyCombineUnmergeWithDeadLanesToTrunc(), applyCombineUnmergeZExtToZExt(), applyExpandFPowI(), llvm::AMDGPUCombinerHelper::applyExpandPromotedF16FMed3(), applyExtendThroughPhis(), applyExtractVecEltBuildVec(), llvm::AMDGPUCombinerHelper::applyFoldableFneg(), applyFoldBinOpIntoSelect(), applyFsubToFneg(), applyFunnelShiftConstantModulo(), applyFunnelShiftToRotate(), applyLshrOfTruncOfLshr(), applyNotCmp(), applyOptBrCondByInvertingCond(), applyPtrAddZero(), applyRotateOutOfRange(), applySDivByPow2(), applySextInRegOfLoad(), applySextTruncSextLoad(), applyShiftImmedChain(), applyShiftOfShiftedLogic(), applyShuffleToExtract(), applySimplifyAddToSub(), applySimplifyURemByPow2(), 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

bool llvm::CombinerHelper::IsPreLegalize
protected

◆ LI

◆ MDT

MachineDominatorTree* llvm::CombinerHelper::MDT
protected

◆ MRI

MachineRegisterInfo& llvm::CombinerHelper::MRI
protected

Definition at line 117 of file CombinerHelper.h.

Referenced by applyAshShlToSextInreg(), applyBuildFnMO(), applyCombineAddP2IToPtrAdd(), 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(), applyFsubToFneg(), applyFunnelShiftConstantModulo(), applyNotCmp(), applyOptBrCondByInvertingCond(), applyPtrAddImmedChain(), applyRotateOutOfRange(), applySDivByPow2(), applySextInRegOfLoad(), applyShiftImmedChain(), applyShiftOfShiftedLogic(), applyShuffleToExtract(), applySimplifyURemByPow2(), applyUDivByPow2(), applyUMulHToLShr(), applyUseVectorTruncate(), applyXorOfAndWithSameReg(), buildSDivOrSRemUsingMul(), buildUDivOrURemUsingMul(), canCombineFMadOrFMA(), CombinerHelper(), getRegBank(), matchAddEToAddO(), matchAddOfVScale(), matchAddOverflow(), matchAddSubSameReg(), matchAndOrDisjointMask(), matchAshrShlToSextInreg(), matchBinOpSameVal(), matchBitfieldExtractFromAnd(), matchBitfieldExtractFromSExtInReg(), matchBitfieldExtractFromShr(), matchBitfieldExtractFromShrAnd(), matchBuildVectorIdentityFold(), matchCanonicalizeFCmp(), matchCanonicalizeICmp(), matchCastOfBuildVector(), matchCastOfInteger(), matchCastOfSelect(), matchCombineAddP2IToPtrAdd(), matchCombineAnyExtTrunc(), matchCombineConcatVectors(), matchCombineConstPtrAddToI2P(), matchCombineCopy(), matchCombineDivRem(), matchCombineExtendingLoads(), matchCombineExtractedVectorLoad(), matchCombineFAddFMAFMulToFMadOrFMA(), matchCombineFAddFMulToFMadOrFMA(), matchCombineFAddFpExtFMulToFMadOrFMA(), matchCombineFAddFpExtFMulToFMadOrFMAAggressive(), matchCombineFMinMaxNaN(), llvm::AMDGPUCombinerHelper::matchCombineFmulWithSelectToFldexp(), matchCombineFSubFMulToFMadOrFMA(), matchCombineFSubFNegFMulToFMadOrFMA(), matchCombineFSubFpExtFMulToFMadOrFMA(), matchCombineFSubFpExtFNegFMulToFMadOrFMA(), matchCombineI2PToP2I(), matchCombineInsertVecElts(), matchCombineLoadWithAndMask(), matchCombineMergeUnmerge(), matchCombineMulToShl(), matchCombineShiftToUnmerge(), matchCombineShlOfExtend(), matchCombineShuffleConcat(), matchCombineShuffleToBuildVector(), matchCombineShuffleVector(), matchCombineSubToAdd(), matchCombineTruncOfShift(), matchCombineUnmergeConstant(), matchCombineUnmergeMergeToPlainValues(), matchCombineUnmergeUndef(), matchCombineUnmergeWithDeadLanesToTrunc(), matchCombineUnmergeZExtToZExt(), matchCombineZextTrunc(), matchCommuteConstantToRHS(), matchCommuteFPConstantToRHS(), matchCommuteShift(), matchConstantFoldBinOp(), matchConstantFoldCastOp(), matchConstantFoldFMA(), matchConstantFoldFPBinOp(), matchConstantFPOp(), llvm::AMDGPUCombinerHelper::matchConstantIs32BitMask(), matchConstantLargerBitWidth(), matchConstantOp(), matchConstantSelectCmp(), matchDivByPow2(), matchEqualDefs(), llvm::AMDGPUCombinerHelper::matchExpandPromotedF16FMed3(), matchExtendThroughPhis(), matchExtOfExt(), matchExtractAllEltsFromBuildVector(), matchExtractVecEltBuildVec(), matchExtractVectorElement(), matchExtractVectorElementWithBuildVector(), matchExtractVectorElementWithBuildVectorTrunc(), matchExtractVectorElementWithDifferentIndices(), matchExtractVectorElementWithShuffleVector(), llvm::AMDGPUCombinerHelper::matchFoldableFneg(), matchFoldAMinusC1MinusC2(), matchFoldAMinusC1PlusC2(), matchFoldAPlusC1MinusC2(), matchFoldBinOpIntoSelect(), matchFoldC1Minus2MinusC2(), matchFoldC2MinusAPlusC1(), matchFreezeOfSingleMaybePoisonOperand(), matchFsubToFneg(), matchFunnelShiftToRotate(), matchHoistLogicOpWithSameOpcodeHands(), matchICmpToLHSKnownBits(), matchICmpToTrueFalseKnownBits(), matchInsertExtractVecEltOutOfBounds(), matchInsertVectorElementOOB(), matchLoadOrCombine(), matchLshrOfTruncOfLshr(), matchMergeXAndUndef(), matchMergeXAndZero(), matchMulOBy0(), matchMulOBy2(), matchMulOfVScale(), matchNarrowBinop(), matchNarrowBinopFeedingAnd(), matchNonNegZext(), matchNotCmp(), matchOperandIsKnownToBeAPowerOfTwo(), matchOperandIsUndef(), matchOperandIsZero(), matchOrShiftToFunnelShift(), matchOverlappingAnd(), matchPtrAddImmedChain(), matchPtrAddZero(), matchReassocConstantInnerLHS(), matchReassocConstantInnerRHS(), matchReassocFoldConstantsInSubTree(), matchReassocPtrAdd(), matchRedundantAnd(), matchRedundantBinOpInEquality(), matchRedundantNegOperands(), matchRedundantOr(), matchRedundantSExtInReg(), matchRedundantSextInReg(), matchRotateOutOfRange(), matchSDivOrSRemByConst(), matchSelectIMinMax(), matchSelectSameVal(), 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 123 of file CombinerHelper.h.

Referenced by CombinerHelper(), and getRegBank().

◆ TRI

const TargetRegisterInfo* llvm::CombinerHelper::TRI
protected

◆ VT


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