LLVM
15.0.0git
|
#include "llvm/CodeGen/GlobalISel/CombinerHelper.h"
Public Member Functions | |
CombinerHelper (GISelChangeObserver &Observer, MachineIRBuilder &B, GISelKnownBits *KB=nullptr, MachineDominatorTree *MDT=nullptr, const LegalizerInfo *LI=nullptr) | |
GISelKnownBits * | getKnownBits () const |
const TargetLowering & | getTargetLowering () const |
bool | isPreLegalize () const |
bool | isLegal (const LegalityQuery &Query) const |
bool | isLegalOrBeforeLegalizer (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. More... | |
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. More... | |
void | replaceOpcodeWith (MachineInstr &FromMI, unsigned ToOpcode) const |
Replace the opcode in instruction with a new opcode and inform the observer of the changes. More... | |
const RegisterBank * | getRegBank (Register Reg) const |
Get the register bank of Reg . More... | |
void | setRegBank (Register Reg, const RegisterBank *RegBank) |
Set the register bank of Reg . More... | |
bool | tryCombineCopy (MachineInstr &MI) |
If MI is COPY, try to combine it. More... | |
bool | matchCombineCopy (MachineInstr &MI) |
void | applyCombineCopy (MachineInstr &MI) |
bool | isPredecessor (const MachineInstr &DefMI, const MachineInstr &UseMI) |
Returns true if DefMI precedes UseMI or they are the same instruction. More... | |
bool | dominates (const MachineInstr &DefMI, const MachineInstr &UseMI) |
Returns true if DefMI dominates UseMI . More... | |
bool | tryCombineExtendingLoads (MachineInstr &MI) |
If MI is extend that consumes the result of a load, try to combine it. More... | |
bool | matchCombineExtendingLoads (MachineInstr &MI, PreferredTuple &MatchInfo) |
void | applyCombineExtendingLoads (MachineInstr &MI, PreferredTuple &MatchInfo) |
bool | matchCombineLoadWithAndMask (MachineInstr &MI, BuildFnTy &MatchInfo) |
Match (and (load x), mask) -> zextload x. More... | |
bool | tryCombineIndexedLoadStore (MachineInstr &MI) |
Combine MI into a pre-indexed or post-indexed load/store operation if legal and the surrounding code makes it useful. More... | |
bool | matchCombineIndexedLoadStore (MachineInstr &MI, IndexedLoadStoreMatchInfo &MatchInfo) |
void | applyCombineIndexedLoadStore (MachineInstr &MI, IndexedLoadStoreMatchInfo &MatchInfo) |
bool | matchSextTruncSextLoad (MachineInstr &MI) |
void | applySextTruncSextLoad (MachineInstr &MI) |
bool | matchSextInRegOfLoad (MachineInstr &MI, std::tuple< Register, unsigned > &MatchInfo) |
Match sext_inreg(load p), imm -> sextload p. More... | |
void | applySextInRegOfLoad (MachineInstr &MI, std::tuple< Register, unsigned > &MatchInfo) |
bool | matchCombineDivRem (MachineInstr &MI, MachineInstr *&OtherMI) |
Try to combine G_[SU]DIV and G_[SU]REM into a single G_[SU]DIVREM when their source operands are identical. More... | |
void | applyCombineDivRem (MachineInstr &MI, MachineInstr *&OtherMI) |
bool | matchOptBrCondByInvertingCond (MachineInstr &MI, MachineInstr *&BrCond) |
If a brcond's true block is not the fallthrough, make it so by inverting the condition and swapping operands. More... | |
void | applyOptBrCondByInvertingCond (MachineInstr &MI, MachineInstr *&BrCond) |
bool | tryCombineConcatVectors (MachineInstr &MI) |
If MI is G_CONCAT_VECTORS, try to combine it. More... | |
bool | matchCombineConcatVectors (MachineInstr &MI, bool &IsUndef, SmallVectorImpl< Register > &Ops) |
Check if the G_CONCAT_VECTORS MI is undef or if it can be flattened into a build_vector. More... | |
void | applyCombineConcatVectors (MachineInstr &MI, bool IsUndef, const ArrayRef< Register > Ops) |
Replace MI with a flattened build_vector with Ops or an implicit_def if IsUndef is true. More... | |
bool | tryCombineShuffleVector (MachineInstr &MI) |
Try to combine G_SHUFFLE_VECTOR into G_CONCAT_VECTORS. More... | |
bool | matchCombineShuffleVector (MachineInstr &MI, SmallVectorImpl< Register > &Ops) |
Check if the G_SHUFFLE_VECTOR MI can be replaced by a concat_vectors. More... | |
void | applyCombineShuffleVector (MachineInstr &MI, const ArrayRef< Register > Ops) |
Replace MI with a concat_vectors with Ops . More... | |
bool | tryCombineMemCpyFamily (MachineInstr &MI, unsigned MaxLen=0) |
Optimize memcpy intrinsics et al, e.g. More... | |
bool | matchPtrAddImmedChain (MachineInstr &MI, PtrAddChain &MatchInfo) |
void | applyPtrAddImmedChain (MachineInstr &MI, PtrAddChain &MatchInfo) |
bool | matchShiftImmedChain (MachineInstr &MI, RegisterImmPair &MatchInfo) |
Fold (shift (shift base, x), y) -> (shift base (x+y)) More... | |
void | applyShiftImmedChain (MachineInstr &MI, RegisterImmPair &MatchInfo) |
bool | matchShiftOfShiftedLogic (MachineInstr &MI, ShiftOfShiftedLogic &MatchInfo) |
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. More... | |
void | applyShiftOfShiftedLogic (MachineInstr &MI, ShiftOfShiftedLogic &MatchInfo) |
bool | matchCombineMulToShl (MachineInstr &MI, unsigned &ShiftVal) |
Transform a multiply by a power-of-2 value to a left shift. More... | |
void | applyCombineMulToShl (MachineInstr &MI, unsigned &ShiftVal) |
bool | matchCombineShlOfExtend (MachineInstr &MI, RegisterImmPair &MatchData) |
void | applyCombineShlOfExtend (MachineInstr &MI, const RegisterImmPair &MatchData) |
bool | matchCombineMergeUnmerge (MachineInstr &MI, Register &MatchInfo) |
Fold away a merge of an unmerge of the corresponding values. More... | |
bool | matchCombineShiftToUnmerge (MachineInstr &MI, unsigned TargetShiftSize, unsigned &ShiftVal) |
Reduce a shift by a constant to an unmerge and a shift on a half sized type. More... | |
void | applyCombineShiftToUnmerge (MachineInstr &MI, const unsigned &ShiftVal) |
bool | tryCombineShiftToUnmerge (MachineInstr &MI, unsigned TargetShiftAmount) |
bool | matchCombineUnmergeMergeToPlainValues (MachineInstr &MI, SmallVectorImpl< Register > &Operands) |
Transform <ty,...> G_UNMERGE(G_MERGE ty X, Y, Z) -> ty X, Y, Z. More... | |
void | applyCombineUnmergeMergeToPlainValues (MachineInstr &MI, SmallVectorImpl< Register > &Operands) |
bool | matchCombineUnmergeConstant (MachineInstr &MI, SmallVectorImpl< APInt > &Csts) |
Transform G_UNMERGE Constant -> Constant1, Constant2, ... More... | |
void | applyCombineUnmergeConstant (MachineInstr &MI, SmallVectorImpl< APInt > &Csts) |
bool | matchCombineUnmergeUndef (MachineInstr &MI, std::function< void(MachineIRBuilder &)> &MatchInfo) |
Transform G_UNMERGE G_IMPLICIT_DEF -> G_IMPLICIT_DEF, G_IMPLICIT_DEF, ... More... | |
bool | matchCombineUnmergeWithDeadLanesToTrunc (MachineInstr &MI) |
Transform X, Y<dead> = G_UNMERGE Z -> X = G_TRUNC Z. More... | |
void | applyCombineUnmergeWithDeadLanesToTrunc (MachineInstr &MI) |
bool | matchCombineUnmergeZExtToZExt (MachineInstr &MI) |
Transform X, Y = G_UNMERGE(G_ZEXT(Z)) -> X = G_ZEXT(Z); Y = G_CONSTANT 0. More... | |
void | applyCombineUnmergeZExtToZExt (MachineInstr &MI) |
bool | matchCombineConstantFoldFpUnary (MachineInstr &MI, Optional< APFloat > &Cst) |
Transform fp_instr(cst) to constant result of the fp operation. More... | |
void | applyCombineConstantFoldFpUnary (MachineInstr &MI, Optional< APFloat > &Cst) |
bool | matchCombineI2PToP2I (MachineInstr &MI, Register &Reg) |
Transform IntToPtr(PtrToInt(x)) to x if cast is in the same address space. More... | |
void | applyCombineI2PToP2I (MachineInstr &MI, Register &Reg) |
bool | matchCombineP2IToI2P (MachineInstr &MI, Register &Reg) |
Transform PtrToInt(IntToPtr(x)) to x. More... | |
void | applyCombineP2IToI2P (MachineInstr &MI, Register &Reg) |
bool | matchCombineAddP2IToPtrAdd (MachineInstr &MI, std::pair< Register, bool > &PtrRegAndCommute) |
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) More... | |
void | applyCombineAddP2IToPtrAdd (MachineInstr &MI, std::pair< Register, bool > &PtrRegAndCommute) |
bool | matchCombineConstPtrAddToI2P (MachineInstr &MI, APInt &NewCst) |
void | applyCombineConstPtrAddToI2P (MachineInstr &MI, APInt &NewCst) |
bool | matchCombineAnyExtTrunc (MachineInstr &MI, Register &Reg) |
Transform anyext(trunc(x)) to x. More... | |
void | applyCombineAnyExtTrunc (MachineInstr &MI, Register &Reg) |
bool | matchCombineZextTrunc (MachineInstr &MI, Register &Reg) |
Transform zext(trunc(x)) to x. More... | |
bool | matchCombineExtOfExt (MachineInstr &MI, std::tuple< Register, unsigned > &MatchInfo) |
Transform [asz]ext([asz]ext(x)) to [asz]ext x. More... | |
void | applyCombineExtOfExt (MachineInstr &MI, std::tuple< Register, unsigned > &MatchInfo) |
bool | matchCombineFNegOfFNeg (MachineInstr &MI, Register &Reg) |
Transform fneg(fneg(x)) to x. More... | |
bool | matchCombineFAbsOfFAbs (MachineInstr &MI, Register &Src) |
Match fabs(fabs(x)) to fabs(x). More... | |
void | applyCombineFAbsOfFAbs (MachineInstr &MI, Register &Src) |
bool | matchCombineFAbsOfFNeg (MachineInstr &MI, BuildFnTy &MatchInfo) |
Transform fabs(fneg(x)) to fabs(x). More... | |
bool | matchCombineTruncOfExt (MachineInstr &MI, std::pair< Register, unsigned > &MatchInfo) |
Transform trunc ([asz]ext x) to x or ([asz]ext x) or (trunc x). More... | |
void | applyCombineTruncOfExt (MachineInstr &MI, std::pair< Register, unsigned > &MatchInfo) |
bool | matchCombineTruncOfShl (MachineInstr &MI, std::pair< Register, Register > &MatchInfo) |
Transform trunc (shl x, K) to shl (trunc x), K => K < VT.getScalarSizeInBits(). More... | |
void | applyCombineTruncOfShl (MachineInstr &MI, std::pair< Register, Register > &MatchInfo) |
void | applyCombineMulByNegativeOne (MachineInstr &MI) |
Transform G_MUL(x, -1) to G_SUB(0, x) More... | |
bool | matchAnyExplicitUseIsUndef (MachineInstr &MI) |
Return true if any explicit use operand on MI is defined by a G_IMPLICIT_DEF. More... | |
bool | matchAllExplicitUsesAreUndef (MachineInstr &MI) |
Return true if all register explicit use operands on MI are defined by a G_IMPLICIT_DEF. More... | |
bool | matchUndefShuffleVectorMask (MachineInstr &MI) |
Return true if a G_SHUFFLE_VECTOR instruction MI has an undef mask. More... | |
bool | matchUndefStore (MachineInstr &MI) |
Return true if a G_STORE instruction MI is storing an undef value. More... | |
bool | matchUndefSelectCmp (MachineInstr &MI) |
Return true if a G_SELECT instruction MI has an undef comparison. More... | |
bool | matchConstantSelectCmp (MachineInstr &MI, unsigned &OpIdx) |
Return true if a G_SELECT instruction MI has a constant comparison. More... | |
bool | replaceInstWithFConstant (MachineInstr &MI, double C) |
Replace an instruction with a G_FCONSTANT with value C . More... | |
bool | replaceInstWithConstant (MachineInstr &MI, int64_t C) |
Replace an instruction with a G_CONSTANT with value C . More... | |
bool | replaceInstWithConstant (MachineInstr &MI, APInt C) |
Replace an instruction with a G_CONSTANT with value C . More... | |
bool | replaceInstWithUndef (MachineInstr &MI) |
Replace an instruction with a G_IMPLICIT_DEF. More... | |
bool | replaceSingleDefInstWithOperand (MachineInstr &MI, unsigned OpIdx) |
Delete MI and replace all of its uses with its OpIdx-th operand. More... | |
bool | replaceSingleDefInstWithReg (MachineInstr &MI, Register Replacement) |
Delete MI and replace all of its uses with Replacement . More... | |
bool | matchEqualDefs (const MachineOperand &MOP1, const MachineOperand &MOP2) |
Return true if MOP1 and MOP2 are register operands are defined by equivalent instructions. More... | |
bool | matchConstantOp (const MachineOperand &MOP, int64_t C) |
Return true if MOP is defined by a G_CONSTANT with a value equal to C . More... | |
bool | matchSelectSameVal (MachineInstr &MI) |
Optimize (cond ? x : x) -> x. More... | |
bool | matchBinOpSameVal (MachineInstr &MI) |
Optimize (x op x) -> x. More... | |
bool | matchOperandIsZero (MachineInstr &MI, unsigned OpIdx) |
Check if operand OpIdx is zero. More... | |
bool | matchOperandIsUndef (MachineInstr &MI, unsigned OpIdx) |
Check if operand OpIdx is undef. More... | |
bool | matchOperandIsKnownToBeAPowerOfTwo (MachineInstr &MI, unsigned OpIdx) |
Check if operand OpIdx is known to be a power of 2. More... | |
bool | eraseInst (MachineInstr &MI) |
Erase MI . More... | |
bool | matchSimplifyAddToSub (MachineInstr &MI, std::tuple< Register, Register > &MatchInfo) |
Return true if MI is a G_ADD which can be simplified to a G_SUB. More... | |
void | applySimplifyAddToSub (MachineInstr &MI, std::tuple< Register, Register > &MatchInfo) |
bool | matchHoistLogicOpWithSameOpcodeHands (MachineInstr &MI, InstructionStepsMatchInfo &MatchInfo) |
Match (logic_op (op x...), (op y...)) -> (op (logic_op x, y)) More... | |
void | applyBuildInstructionSteps (MachineInstr &MI, InstructionStepsMatchInfo &MatchInfo) |
Replace MI with a series of instructions described in MatchInfo . More... | |
bool | matchAshrShlToSextInreg (MachineInstr &MI, std::tuple< Register, int64_t > &MatchInfo) |
Match ashr (shl x, C), C -> sext_inreg (C) More... | |
void | applyAshShlToSextInreg (MachineInstr &MI, std::tuple< Register, int64_t > &MatchInfo) |
bool | matchOverlappingAnd (MachineInstr &MI, BuildFnTy &MatchInfo) |
Fold and(and(x, C1), C2) -> C1&C2 ? and(x, C1&C2) : 0. More... | |
bool | matchRedundantAnd (MachineInstr &MI, Register &Replacement) |
bool | matchRedundantOr (MachineInstr &MI, Register &Replacement) |
bool | matchRedundantSExtInReg (MachineInstr &MI) |
bool | matchNotCmp (MachineInstr &MI, SmallVectorImpl< Register > &RegsToNegate) |
Combine inverting a result of a compare into the opposite cond code. More... | |
void | applyNotCmp (MachineInstr &MI, SmallVectorImpl< Register > &RegsToNegate) |
bool | matchXorOfAndWithSameReg (MachineInstr &MI, std::pair< Register, Register > &MatchInfo) |
Fold (xor (and x, y), y) -> (and (not x), y) {. More... | |
void | applyXorOfAndWithSameReg (MachineInstr &MI, std::pair< Register, Register > &MatchInfo) |
bool | matchPtrAddZero (MachineInstr &MI) |
} More... | |
void | applyPtrAddZero (MachineInstr &MI) |
void | applySimplifyURemByPow2 (MachineInstr &MI) |
Combine G_UREM x, (known power of 2) to an add and bitmasking. More... | |
bool | matchFoldBinOpIntoSelect (MachineInstr &MI, unsigned &SelectOpNo) |
Push a binary operator through a select on constants. More... | |
bool | applyFoldBinOpIntoSelect (MachineInstr &MI, const unsigned &SelectOpNo) |
SelectOperand is the operand in binary operator MI that is the select to fold. More... | |
bool | matchCombineInsertVecElts (MachineInstr &MI, SmallVectorImpl< Register > &MatchInfo) |
void | applyCombineInsertVecElts (MachineInstr &MI, SmallVectorImpl< Register > &MatchInfo) |
bool | matchLoadOrCombine (MachineInstr &MI, BuildFnTy &MatchInfo) |
Match expression trees of the form. More... | |
bool | matchTruncStoreMerge (MachineInstr &MI, MergeTruncStoresInfo &MatchInfo) |
Match a pattern where a wide type scalar value is stored by several narrow stores. More... | |
void | applyTruncStoreMerge (MachineInstr &MI, MergeTruncStoresInfo &MatchInfo) |
bool | matchExtendThroughPhis (MachineInstr &MI, MachineInstr *&ExtMI) |
void | applyExtendThroughPhis (MachineInstr &MI, MachineInstr *&ExtMI) |
bool | matchExtractVecEltBuildVec (MachineInstr &MI, Register &Reg) |
void | applyExtractVecEltBuildVec (MachineInstr &MI, Register &Reg) |
bool | matchExtractAllEltsFromBuildVector (MachineInstr &MI, SmallVectorImpl< std::pair< Register, MachineInstr * >> &MatchInfo) |
void | applyExtractAllEltsFromBuildVector (MachineInstr &MI, SmallVectorImpl< std::pair< Register, MachineInstr * >> &MatchInfo) |
void | applyBuildFn (MachineInstr &MI, BuildFnTy &MatchInfo) |
Use a function which takes in a MachineIRBuilder to perform a combine. More... | |
void | applyBuildFnNoErase (MachineInstr &MI, BuildFnTy &MatchInfo) |
Use a function which takes in a MachineIRBuilder to perform a combine. More... | |
bool | matchOrShiftToFunnelShift (MachineInstr &MI, BuildFnTy &MatchInfo) |
bool | matchFunnelShiftToRotate (MachineInstr &MI) |
Match an FSHL or FSHR that can be combined to a ROTR or ROTL rotate. More... | |
void | applyFunnelShiftToRotate (MachineInstr &MI) |
bool | matchRotateOutOfRange (MachineInstr &MI) |
void | applyRotateOutOfRange (MachineInstr &MI) |
bool | matchICmpToTrueFalseKnownBits (MachineInstr &MI, int64_t &MatchInfo) |
bool | matchICmpToLHSKnownBits (MachineInstr &MI, BuildFnTy &MatchInfo) |
bool | matchAndOrDisjointMask (MachineInstr &MI, BuildFnTy &MatchInfo) |
bool | matchBitfieldExtractFromSExtInReg (MachineInstr &MI, BuildFnTy &MatchInfo) |
Form a G_SBFX from a G_SEXT_INREG fed by a right shift. More... | |
bool | matchBitfieldExtractFromAnd (MachineInstr &MI, BuildFnTy &MatchInfo) |
Match: and (lshr x, cst), mask -> ubfx x, cst, width. More... | |
bool | matchBitfieldExtractFromShr (MachineInstr &MI, BuildFnTy &MatchInfo) |
Match: shr (shl x, n), k -> sbfx/ubfx x, pos, width. More... | |
bool | matchBitfieldExtractFromShrAnd (MachineInstr &MI, BuildFnTy &MatchInfo) |
Match: shr (and x, n), k -> ubfx x, pos, width. More... | |
bool | matchReassocConstantInnerRHS (GPtrAdd &MI, MachineInstr *RHS, BuildFnTy &MatchInfo) |
bool | matchReassocFoldConstantsInSubTree (GPtrAdd &MI, MachineInstr *LHS, MachineInstr *RHS, BuildFnTy &MatchInfo) |
bool | matchReassocConstantInnerLHS (GPtrAdd &MI, MachineInstr *LHS, MachineInstr *RHS, BuildFnTy &MatchInfo) |
bool | matchReassocPtrAdd (MachineInstr &MI, BuildFnTy &MatchInfo) |
Reassociate pointer calculations with G_ADD involved, to allow better addressing mode usage. More... | |
bool | matchConstantFold (MachineInstr &MI, APInt &MatchInfo) |
Do constant folding when opportunities are exposed after MIR building. More... | |
bool | matchNarrowBinopFeedingAnd (MachineInstr &MI, BuildFnTy &MatchInfo) |
MachineInstr * | buildUDivUsingMul (MachineInstr &MI) |
Given an G_UDIV MI expressing a divide by constant, return an expression that implements it by multiplying by a magic number. More... | |
bool | matchUDivByConst (MachineInstr &MI) |
Combine G_UDIV by constant into a multiply by magic constant. More... | |
void | applyUDivByConst (MachineInstr &MI) |
bool | matchUMulHToLShr (MachineInstr &MI) |
void | applyUMulHToLShr (MachineInstr &MI) |
bool | tryCombine (MachineInstr &MI) |
Try to transform MI by using all of the above combine functions. More... | |
bool | tryEmitMemcpyInline (MachineInstr &MI) |
Emit loads and stores that perform the given memcpy. More... | |
bool | matchMulOBy2 (MachineInstr &MI, BuildFnTy &MatchInfo) |
Match: (G_UMULO x, 2) -> (G_UADDO x, x) (G_SMULO x, 2) -> (G_SADDO x, x) More... | |
bool | matchMulOBy0 (MachineInstr &MI, BuildFnTy &MatchInfo) |
Match: (G_*MULO x, 0) -> 0 + no carry out. More... | |
bool | matchAddOBy0 (MachineInstr &MI, BuildFnTy &MatchInfo) |
Match: (G_*ADDO x, 0) -> x + no carry out. More... | |
bool | matchRedundantNegOperands (MachineInstr &MI, BuildFnTy &MatchInfo) |
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) More... | |
bool | canCombineFMadOrFMA (MachineInstr &MI, bool &AllowFusionGlobally, bool &HasFMAD, bool &Aggressive, bool CanReassociate=false) |
bool | matchCombineFAddFMulToFMadOrFMA (MachineInstr &MI, BuildFnTy &MatchInfo) |
Transform (fadd (fmul x, y), z) -> (fma x, y, z) (fadd (fmul x, y), z) -> (fmad x, y, z) More... | |
bool | matchCombineFAddFpExtFMulToFMadOrFMA (MachineInstr &MI, BuildFnTy &MatchInfo) |
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) More... | |
bool | matchCombineFAddFMAFMulToFMadOrFMA (MachineInstr &MI, BuildFnTy &MatchInfo) |
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)) More... | |
bool | matchCombineFAddFpExtFMulToFMadOrFMAAggressive (MachineInstr &MI, BuildFnTy &MatchInfo) |
bool | matchCombineFSubFMulToFMadOrFMA (MachineInstr &MI, BuildFnTy &MatchInfo) |
Transform (fsub (fmul x, y), z) -> (fma x, y, -z) (fsub (fmul x, y), z) -> (fmad x, y, -z) More... | |
bool | matchCombineFSubFNegFMulToFMadOrFMA (MachineInstr &MI, BuildFnTy &MatchInfo) |
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)) More... | |
bool | matchCombineFSubFpExtFMulToFMadOrFMA (MachineInstr &MI, BuildFnTy &MatchInfo) |
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)) More... | |
bool | matchCombineFSubFpExtFNegFMulToFMadOrFMA (MachineInstr &MI, BuildFnTy &MatchInfo) |
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)) More... | |
bool | matchSelectToLogical (MachineInstr &MI, BuildFnTy &MatchInfo) |
Fold boolean selects to logical operations. More... | |
bool | matchCombineFMinMaxNaN (MachineInstr &MI, unsigned &Info) |
Protected Attributes | |
MachineIRBuilder & | Builder |
MachineRegisterInfo & | MRI |
GISelChangeObserver & | Observer |
GISelKnownBits * | KB |
MachineDominatorTree * | MDT |
const LegalizerInfo * | LI |
const RegisterBankInfo * | RBI |
const TargetRegisterInfo * | TRI |
Definition at line 108 of file CombinerHelper.h.
CombinerHelper::CombinerHelper | ( | GISelChangeObserver & | Observer, |
MachineIRBuilder & | B, | ||
GISelKnownBits * | KB = nullptr , |
||
MachineDominatorTree * | MDT = nullptr , |
||
const LegalizerInfo * | LI = nullptr |
||
) |
Definition at line 48 of file CombinerHelper.cpp.
void CombinerHelper::applyAshShlToSextInreg | ( | MachineInstr & | MI, |
std::tuple< Register, int64_t > & | MatchInfo | ||
) |
Definition at line 2731 of file CombinerHelper.cpp.
References assert(), Builder, llvm::MachineIRBuilder::buildSExtInReg(), llvm::LLT::getScalarSizeInBits(), llvm::MachineRegisterInfo::getType(), MI, MRI, and llvm::MachineIRBuilder::setInstrAndDebugLoc().
void CombinerHelper::applyBuildFn | ( | MachineInstr & | MI, |
BuildFnTy & | MatchInfo | ||
) |
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 3999 of file CombinerHelper.cpp.
References Builder, MI, and llvm::MachineIRBuilder::setInstrAndDebugLoc().
void CombinerHelper::applyBuildFnNoErase | ( | MachineInstr & | MI, |
BuildFnTy & | MatchInfo | ||
) |
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 4006 of file CombinerHelper.cpp.
References Builder, MI, and llvm::MachineIRBuilder::setInstrAndDebugLoc().
void CombinerHelper::applyBuildInstructionSteps | ( | MachineInstr & | MI, |
InstructionStepsMatchInfo & | MatchInfo | ||
) |
Replace MI
with a series of instructions described in MatchInfo
.
Definition at line 2698 of file CombinerHelper.cpp.
References assert(), Builder, llvm::MachineIRBuilder::buildInstr(), llvm::InstructionStepsMatchInfo::InstrsToBuild, MI, and llvm::MachineIRBuilder::setInstr().
void CombinerHelper::applyCombineAddP2IToPtrAdd | ( | MachineInstr & | MI, |
std::pair< Register, bool > & | PtrRegAndCommute | ||
) |
Definition at line 2038 of file CombinerHelper.cpp.
References Builder, llvm::MachineIRBuilder::buildPtrAdd(), llvm::MachineIRBuilder::buildPtrToInt(), llvm::MachineRegisterInfo::getType(), LHS, MI, MRI, RHS, llvm::MachineIRBuilder::setInstrAndDebugLoc(), and std::swap().
void llvm::CombinerHelper::applyCombineAnyExtTrunc | ( | MachineInstr & | MI, |
Register & | Reg | ||
) |
void CombinerHelper::applyCombineConcatVectors | ( | MachineInstr & | MI, |
bool | IsUndef, | ||
const ArrayRef< Register > | Ops | ||
) |
Replace MI
with a flattened build_vector with Ops
or an implicit_def if IsUndef is true.
Definition at line 272 of file CombinerHelper.cpp.
References llvm::MachineIRBuilder::buildBuildVector(), Builder, llvm::MachineIRBuilder::buildUndef(), llvm::MachineRegisterInfo::cloneVirtualRegister(), MI, MRI, replaceRegWith(), and llvm::MachineIRBuilder::setInsertPt().
Referenced by tryCombineConcatVectors().
void CombinerHelper::applyCombineConstantFoldFpUnary | ( | MachineInstr & | MI, |
Optional< APFloat > & | Cst | ||
) |
Definition at line 1297 of file CombinerHelper.cpp.
References assert(), Builder, llvm::MachineIRBuilder::buildFConstant(), llvm::ConstantFP::get(), llvm::Function::getContext(), llvm::MachineFunction::getFunction(), llvm::MachineIRBuilder::getMF(), llvm::Optional< T >::hasValue(), MI, and llvm::MachineIRBuilder::setInstrAndDebugLoc().
void CombinerHelper::applyCombineConstPtrAddToI2P | ( | MachineInstr & | MI, |
APInt & | NewCst | ||
) |
Definition at line 2078 of file CombinerHelper.cpp.
References llvm::MachineIRBuilder::buildConstant(), Builder, MI, and llvm::MachineIRBuilder::setInstrAndDebugLoc().
void CombinerHelper::applyCombineCopy | ( | MachineInstr & | MI | ) |
Definition at line 210 of file CombinerHelper.cpp.
References MI, MRI, and replaceRegWith().
Referenced by tryCombineCopy().
void CombinerHelper::applyCombineDivRem | ( | MachineInstr & | MI, |
MachineInstr *& | OtherMI | ||
) |
Definition at line 1132 of file CombinerHelper.cpp.
References assert(), Builder, llvm::MachineIRBuilder::buildInstr(), dominates(), llvm::MachineInstr::eraseFromParent(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), getReg(), MI, and llvm::MachineIRBuilder::setInstrAndDebugLoc().
void CombinerHelper::applyCombineExtendingLoads | ( | MachineInstr & | MI, |
PreferredTuple & | MatchInfo | ||
) |
rewrites to:
rewrites to:
Definition at line 563 of file CombinerHelper.cpp.
References Builder, llvm::MachineIRBuilder::buildTrunc(), llvm::GISelChangeObserver::changedInstr(), llvm::GISelChangeObserver::changingInstr(), llvm::MachineRegisterInfo::cloneVirtualRegister(), llvm::MachineInstr::eraseFromParent(), llvm::GISelChangeObserver::erasingInstr(), llvm::PreferredTuple::ExtendOpcode, llvm::MCInstrInfo::get(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getParent(), llvm::MachineOperand::getReg(), llvm::LLT::getSizeInBits(), llvm::MachineIRBuilder::getTII(), llvm::MachineRegisterInfo::getType(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, DenseMapInfo< KeyT >, llvm::detail::DenseMapPair< KeyT, ValueT > >, KeyT, ValueT, DenseMapInfo< KeyT >, llvm::detail::DenseMapPair< KeyT, ValueT > >::lookup(), llvm::PreferredTuple::MI, MI, MRI, Observer, replaceRegOpWith(), replaceRegWith(), llvm::MachineIRBuilder::setInsertPt(), llvm::MachineOperand::setReg(), llvm::PreferredTuple::Ty, llvm::MachineRegisterInfo::use_operands(), UseMI, and Uses.
Referenced by tryCombineExtendingLoads().
void CombinerHelper::applyCombineExtOfExt | ( | MachineInstr & | MI, |
std::tuple< Register, unsigned > & | MatchInfo | ||
) |
Definition at line 2132 of file CombinerHelper.cpp.
References assert(), Builder, llvm::MachineIRBuilder::buildInstr(), llvm::GISelChangeObserver::changedInstr(), llvm::GISelChangeObserver::changingInstr(), MI, Observer, and llvm::MachineIRBuilder::setInstrAndDebugLoc().
void llvm::CombinerHelper::applyCombineFAbsOfFAbs | ( | MachineInstr & | MI, |
Register & | Src | ||
) |
void CombinerHelper::applyCombineI2PToP2I | ( | MachineInstr & | MI, |
Register & | Reg | ||
) |
Definition at line 1991 of file CombinerHelper.cpp.
References assert(), llvm::MachineIRBuilder::buildCopy(), Builder, MI, and llvm::MachineIRBuilder::setInstr().
void CombinerHelper::applyCombineIndexedLoadStore | ( | MachineInstr & | MI, |
IndexedLoadStoreMatchInfo & | MatchInfo | ||
) |
Definition at line 1028 of file CombinerHelper.cpp.
References llvm::MachineInstrBuilder::addDef(), llvm::MachineInstrBuilder::addImm(), llvm::IndexedLoadStoreMatchInfo::Addr, llvm::MachineInstrBuilder::addUse(), llvm::IndexedLoadStoreMatchInfo::Base, llvm::MachineIRBuilder::buildInstr(), llvm::dbgs(), llvm::MachineInstr::eraseFromParent(), llvm::MachineRegisterInfo::getUniqueVRegDef(), llvm::IndexedLoadStoreMatchInfo::IsPre, LLVM_DEBUG, llvm_unreachable, MI, MRI, and llvm::IndexedLoadStoreMatchInfo::Offset.
Referenced by tryCombineIndexedLoadStore().
void CombinerHelper::applyCombineInsertVecElts | ( | MachineInstr & | MI, |
SmallVectorImpl< Register > & | MatchInfo | ||
) |
Definition at line 2579 of file CombinerHelper.cpp.
References llvm::MachineIRBuilder::buildBuildVector(), Builder, llvm::MachineIRBuilder::buildUndef(), getReg(), llvm::LLT::getScalarType(), llvm::MachineRegisterInfo::getType(), I, MI, MRI, and llvm::MachineIRBuilder::setInstr().
void CombinerHelper::applyCombineMulByNegativeOne | ( | MachineInstr & | MI | ) |
Transform G_MUL(x, -1) to G_SUB(0, x)
Definition at line 2163 of file CombinerHelper.cpp.
References assert(), llvm::MachineIRBuilder::buildConstant(), Builder, llvm::MachineIRBuilder::buildSub(), llvm::MachineRegisterInfo::getType(), MI, MRI, and llvm::MachineIRBuilder::setInstrAndDebugLoc().
void CombinerHelper::applyCombineMulToShl | ( | MachineInstr & | MI, |
unsigned & | ShiftVal | ||
) |
Definition at line 1588 of file CombinerHelper.cpp.
References assert(), llvm::MachineIRBuilder::buildConstant(), llvm::GISelChangeObserver::changedInstr(), llvm::GISelChangeObserver::changingInstr(), llvm::MCInstrInfo::get(), llvm::MachineIRBuilder::getTII(), llvm::MachineRegisterInfo::getType(), MI, MRI, and Observer.
void CombinerHelper::applyCombineP2IToI2P | ( | MachineInstr & | MI, |
Register & | Reg | ||
) |
Definition at line 2005 of file CombinerHelper.cpp.
References assert(), Builder, llvm::MachineIRBuilder::buildZExtOrTrunc(), MI, and llvm::MachineIRBuilder::setInstr().
void CombinerHelper::applyCombineShiftToUnmerge | ( | MachineInstr & | MI, |
const unsigned & | ShiftVal | ||
) |
Definition at line 1898 of file CombinerHelper.cpp.
References assert(), llvm::MachineIRBuilder::buildAShr(), llvm::MachineIRBuilder::buildConstant(), Builder, llvm::MachineIRBuilder::buildLShr(), llvm::MachineIRBuilder::buildMerge(), llvm::MachineIRBuilder::buildShl(), llvm::MachineIRBuilder::buildUnmerge(), llvm::MachineInstrBuilder::getReg(), llvm::LLT::getSizeInBits(), llvm::MachineRegisterInfo::getType(), MI, MRI, llvm::LLT::scalar(), and llvm::MachineIRBuilder::setInstr().
Referenced by tryCombineShiftToUnmerge().
void CombinerHelper::applyCombineShlOfExtend | ( | MachineInstr & | MI, |
const RegisterImmPair & | MatchData | ||
) |
Definition at line 1638 of file CombinerHelper.cpp.
References llvm::MachineIRBuilder::buildConstant(), Builder, llvm::MachineIRBuilder::buildShl(), llvm::MachineIRBuilder::buildZExt(), llvm::MachineRegisterInfo::getType(), llvm::RegisterImmPair::Imm, MI, MRI, llvm::RegisterImmPair::Reg, and llvm::MachineIRBuilder::setInstrAndDebugLoc().
void CombinerHelper::applyCombineShuffleVector | ( | MachineInstr & | MI, |
const ArrayRef< Register > | Ops | ||
) |
Replace MI
with a concat_vectors with Ops
.
Definition at line 379 of file CombinerHelper.cpp.
References llvm::MachineIRBuilder::buildCopy(), Builder, llvm::MachineIRBuilder::buildMerge(), llvm::MachineRegisterInfo::cloneVirtualRegister(), MI, MRI, replaceRegWith(), llvm::MachineIRBuilder::setInsertPt(), and llvm::ArrayRef< T >::size().
Referenced by tryCombineShuffleVector().
void CombinerHelper::applyCombineTruncOfExt | ( | MachineInstr & | MI, |
std::pair< Register, unsigned > & | MatchInfo | ||
) |
Definition at line 2219 of file CombinerHelper.cpp.
References assert(), Builder, llvm::MachineIRBuilder::buildInstr(), llvm::MachineIRBuilder::buildTrunc(), llvm::LLT::getSizeInBits(), llvm::MachineRegisterInfo::getType(), MI, MRI, replaceRegWith(), and llvm::MachineIRBuilder::setInstrAndDebugLoc().
void CombinerHelper::applyCombineTruncOfShl | ( | MachineInstr & | MI, |
std::pair< Register, Register > & | MatchInfo | ||
) |
Definition at line 2264 of file CombinerHelper.cpp.
References assert(), Builder, llvm::MachineIRBuilder::buildShl(), llvm::MachineIRBuilder::buildTrunc(), llvm::MachineInstr::getFlags(), llvm::MachineRegisterInfo::getType(), llvm::MachineRegisterInfo::getVRegDef(), MI, MRI, and llvm::MachineIRBuilder::setInstrAndDebugLoc().
void CombinerHelper::applyCombineUnmergeConstant | ( | MachineInstr & | MI, |
SmallVectorImpl< APInt > & | Csts | ||
) |
Definition at line 1751 of file CombinerHelper.cpp.
References assert(), llvm::MachineIRBuilder::buildConstant(), Builder, MI, and llvm::MachineIRBuilder::setInstrAndDebugLoc().
void CombinerHelper::applyCombineUnmergeMergeToPlainValues | ( | MachineInstr & | MI, |
SmallVectorImpl< Register > & | Operands | ||
) |
Definition at line 1703 of file CombinerHelper.cpp.
References assert(), llvm::MachineIRBuilder::buildCast(), Builder, llvm::MachineRegisterInfo::getType(), MI, MRI, Operands, replaceRegWith(), and llvm::MachineIRBuilder::setInstrAndDebugLoc().
void CombinerHelper::applyCombineUnmergeWithDeadLanesToTrunc | ( | MachineInstr & | MI | ) |
Definition at line 1792 of file CombinerHelper.cpp.
References llvm::MachineIRBuilder::buildCast(), Builder, llvm::MachineIRBuilder::buildTrunc(), llvm::MachineInstrBuilder::getReg(), llvm::LLT::getSizeInBits(), llvm::MachineRegisterInfo::getType(), llvm::LLT::isVector(), MI, MRI, llvm::LLT::scalar(), and llvm::MachineIRBuilder::setInstrAndDebugLoc().
void CombinerHelper::applyCombineUnmergeZExtToZExt | ( | MachineInstr & | MI | ) |
Definition at line 1839 of file CombinerHelper.cpp.
References assert(), llvm::MachineIRBuilder::buildConstant(), Builder, llvm::MachineIRBuilder::buildZExt(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MachineInstrBuilder::getReg(), llvm::MachineOperand::getReg(), llvm::LLT::getSizeInBits(), llvm::MachineRegisterInfo::getType(), llvm::MachineRegisterInfo::getVRegDef(), MI, MRI, replaceRegWith(), and llvm::MachineIRBuilder::setInstrAndDebugLoc().
void CombinerHelper::applyExtendThroughPhis | ( | MachineInstr & | MI, |
MachineInstr *& | ExtMI | ||
) |
Definition at line 3845 of file CombinerHelper.cpp.
References llvm::MachineInstrBuilder::addDef(), llvm::MachineInstrBuilder::addMBB(), assert(), Builder, llvm::MachineIRBuilder::buildExtOrTrunc(), llvm::MachineIRBuilder::buildInstrNoInsert(), llvm::drop_begin(), llvm::MachineBasicBlock::end(), llvm::MachineInstr::eraseFromParent(), llvm::MachineBasicBlock::getFirstNonPHI(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MachineBasicBlock::getParent(), llvm::MachineOperand::getReg(), llvm::MachineRegisterInfo::getType(), llvm::MachineRegisterInfo::getVRegDef(), llvm::SetVector< T, SmallVector< T, N >, SmallDenseSet< T, N > >::insert(), llvm::MachineIRBuilder::insertInstr(), MBB, MI, MRI, llvm::MachineIRBuilder::setDebugLoc(), llvm::MachineIRBuilder::setInsertPt(), and llvm::MachineIRBuilder::setInstrAndDebugLoc().
void CombinerHelper::applyExtractAllEltsFromBuildVector | ( | MachineInstr & | MI, |
SmallVectorImpl< std::pair< Register, MachineInstr * >> & | MatchInfo | ||
) |
Definition at line 3987 of file CombinerHelper.cpp.
References assert(), MI, MRI, and replaceRegWith().
void CombinerHelper::applyExtractVecEltBuildVec | ( | MachineInstr & | MI, |
Register & | Reg | ||
) |
Definition at line 3927 of file CombinerHelper.cpp.
References assert(), Builder, llvm::MachineIRBuilder::buildTrunc(), llvm::LLT::getSizeInBits(), llvm::MachineRegisterInfo::getType(), MI, MRI, replaceSingleDefInstWithReg(), and llvm::MachineIRBuilder::setInstrAndDebugLoc().
bool CombinerHelper::applyFoldBinOpIntoSelect | ( | MachineInstr & | MI, |
const unsigned & | SelectOpNo | ||
) |
SelectOperand
is the operand in binary operator MI
that is the select to fold.
Definition at line 3135 of file CombinerHelper.cpp.
References Builder, llvm::MachineIRBuilder::buildInstr(), llvm::MachineIRBuilder::buildSelect(), llvm::GISelChangeObserver::erasingInstr(), getReg(), llvm::MachineRegisterInfo::getType(), llvm::MachineRegisterInfo::getVRegDef(), LHS, MI, MRI, Observer, RHS, llvm::MCID::Select, and llvm::MachineIRBuilder::setInstrAndDebugLoc().
void CombinerHelper::applyFunnelShiftToRotate | ( | MachineInstr & | MI | ) |
Definition at line 4078 of file CombinerHelper.cpp.
References assert(), Builder, llvm::GISelChangeObserver::changedInstr(), llvm::GISelChangeObserver::changingInstr(), llvm::MCInstrInfo::get(), llvm::MachineIRBuilder::getTII(), MI, and Observer.
void CombinerHelper::applyNotCmp | ( | MachineInstr & | MI, |
SmallVectorImpl< Register > & | RegsToNegate | ||
) |
Definition at line 2963 of file CombinerHelper.cpp.
References Builder, llvm::GISelChangeObserver::changedInstr(), llvm::GISelChangeObserver::changingInstr(), llvm::tgtok::Def, llvm::MCInstrInfo::get(), llvm::CmpInst::getInversePredicate(), llvm::MachineOperand::getPredicate(), llvm::MachineIRBuilder::getTII(), llvm::MachineRegisterInfo::getVRegDef(), llvm_unreachable, MI, MRI, Observer, replaceRegWith(), and llvm::MachineOperand::setPredicate().
void CombinerHelper::applyOptBrCondByInvertingCond | ( | MachineInstr & | MI, |
MachineInstr *& | BrCond | ||
) |
Definition at line 1198 of file CombinerHelper.cpp.
References llvm::MachineIRBuilder::buildConstant(), Builder, llvm::MachineIRBuilder::buildXor(), llvm::GISelChangeObserver::changedInstr(), llvm::GISelChangeObserver::changingInstr(), llvm::getICmpTrueVal(), llvm::MachineOperand::getMBB(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), getTargetLowering(), llvm::MachineRegisterInfo::getType(), MI, MRI, Observer, llvm::MachineIRBuilder::setInstrAndDebugLoc(), llvm::MachineOperand::setMBB(), llvm::MachineOperand::setReg(), and llvm::Xor.
void CombinerHelper::applyPtrAddImmedChain | ( | MachineInstr & | MI, |
PtrAddChain & | MatchInfo | ||
) |
Definition at line 1370 of file CombinerHelper.cpp.
References assert(), llvm::PtrAddChain::Bank, llvm::PtrAddChain::Base, llvm::MachineIRBuilder::buildConstant(), llvm::GISelChangeObserver::changedInstr(), llvm::GISelChangeObserver::changingInstr(), llvm::MachineRegisterInfo::getType(), llvm::PtrAddChain::Imm, MI, MRI, Observer, and setRegBank().
void CombinerHelper::applyPtrAddZero | ( | MachineInstr & | MI | ) |
Definition at line 3059 of file CombinerHelper.cpp.
References Builder, llvm::MachineIRBuilder::buildIntToPtr(), MI, and llvm::MachineIRBuilder::setInstrAndDebugLoc().
void CombinerHelper::applyRotateOutOfRange | ( | MachineInstr & | MI | ) |
Definition at line 4105 of file CombinerHelper.cpp.
References assert(), llvm::tgtok::Bits, llvm::MachineIRBuilder::buildConstant(), Builder, llvm::MachineIRBuilder::buildURem(), llvm::GISelChangeObserver::changedInstr(), llvm::GISelChangeObserver::changingInstr(), llvm::MachineInstrBuilder::getReg(), llvm::LLT::getScalarSizeInBits(), llvm::MachineRegisterInfo::getType(), MI, MRI, Observer, and llvm::MachineIRBuilder::setInstrAndDebugLoc().
void CombinerHelper::applySextInRegOfLoad | ( | MachineInstr & | MI, |
std::tuple< Register, unsigned > & | MatchInfo | ||
) |
Definition at line 845 of file CombinerHelper.cpp.
References assert(), Builder, llvm::MachineIRBuilder::buildLoadInstr(), llvm::MachineFunction::getMachineMemOperand(), llvm::MachineIRBuilder::getMF(), llvm::GLoadStore::getMMO(), llvm::GLoadStore::getPointerReg(), llvm::MachineRegisterInfo::getVRegDef(), MI, MRI, and llvm::MachineIRBuilder::setInstrAndDebugLoc().
void CombinerHelper::applySextTruncSextLoad | ( | MachineInstr & | MI | ) |
Definition at line 797 of file CombinerHelper.cpp.
References assert(), llvm::MachineIRBuilder::buildCopy(), Builder, MI, and llvm::MachineIRBuilder::setInstrAndDebugLoc().
void CombinerHelper::applyShiftImmedChain | ( | MachineInstr & | MI, |
RegisterImmPair & | MatchInfo | ||
) |
Definition at line 1428 of file CombinerHelper.cpp.
References assert(), llvm::MachineIRBuilder::buildConstant(), Builder, llvm::GISelChangeObserver::changedInstr(), llvm::GISelChangeObserver::changingInstr(), llvm::MachineInstrBuilder::getReg(), llvm::LLT::getScalarSizeInBits(), llvm::MachineRegisterInfo::getType(), llvm::RegisterImmPair::Imm, MI, MRI, Observer, llvm::RegisterImmPair::Reg, and llvm::MachineIRBuilder::setInstrAndDebugLoc().
void CombinerHelper::applyShiftOfShiftedLogic | ( | MachineInstr & | MI, |
ShiftOfShiftedLogic & | MatchInfo | ||
) |
Definition at line 1542 of file CombinerHelper.cpp.
References assert(), llvm::MachineIRBuilder::buildConstant(), Builder, llvm::MachineIRBuilder::buildInstr(), llvm::MachineInstr::eraseFromParent(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MachineInstrBuilder::getReg(), llvm::MachineOperand::getReg(), getReg(), llvm::MachineRegisterInfo::getType(), llvm::ShiftOfShiftedLogic::Logic, llvm::ShiftOfShiftedLogic::LogicNonShiftReg, MI, MRI, llvm::MachineIRBuilder::setInstrAndDebugLoc(), llvm::ShiftOfShiftedLogic::Shift2, and llvm::ShiftOfShiftedLogic::ValSum.
void CombinerHelper::applySimplifyAddToSub | ( | MachineInstr & | MI, |
std::tuple< Register, Register > & | MatchInfo | ||
) |
Definition at line 2598 of file CombinerHelper.cpp.
References Builder, llvm::MachineIRBuilder::buildSub(), MI, and llvm::MachineIRBuilder::setInstr().
void CombinerHelper::applySimplifyURemByPow2 | ( | MachineInstr & | MI | ) |
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 3067 of file CombinerHelper.cpp.
References llvm::MachineIRBuilder::buildAdd(), llvm::MachineIRBuilder::buildAnd(), llvm::MachineIRBuilder::buildConstant(), Builder, llvm::MachineRegisterInfo::getType(), MI, MRI, and llvm::MachineIRBuilder::setInstrAndDebugLoc().
void CombinerHelper::applyTruncStoreMerge | ( | MachineInstr & | MI, |
MergeTruncStoresInfo & | MatchInfo | ||
) |
Definition at line 3763 of file CombinerHelper.cpp.
References assert(), llvm::MachineIRBuilder::buildBSwap(), llvm::MachineIRBuilder::buildConstant(), Builder, llvm::MachineIRBuilder::buildRotateRight(), llvm::MachineIRBuilder::buildStore(), llvm::MergeTruncStoresInfo::FoundStores, llvm::MachineMemOperand::getAlign(), llvm::GLoadStore::getMMO(), llvm::MachineMemOperand::getPointerInfo(), llvm::GLoadStore::getPointerReg(), llvm::MachineInstrBuilder::getReg(), llvm::LLT::getSizeInBits(), llvm::MachineRegisterInfo::getType(), llvm::MergeTruncStoresInfo::LowestIdxStore, MI, MRI, llvm::MergeTruncStoresInfo::NeedBSwap, llvm::MergeTruncStoresInfo::NeedRotate, llvm::MachineIRBuilder::setInstrAndDebugLoc(), llvm::ARM_MB::ST, and llvm::MergeTruncStoresInfo::WideSrcVal.
void CombinerHelper::applyUDivByConst | ( | MachineInstr & | MI | ) |
Definition at line 4912 of file CombinerHelper.cpp.
References buildUDivUsingMul(), MI, and replaceSingleDefInstWithReg().
void CombinerHelper::applyUMulHToLShr | ( | MachineInstr & | MI | ) |
Definition at line 4933 of file CombinerHelper.cpp.
References llvm::MachineIRBuilder::buildConstant(), Builder, buildLogBase2(), llvm::MachineIRBuilder::buildLShr(), llvm::MachineIRBuilder::buildSub(), llvm::MachineIRBuilder::buildZExtOrTrunc(), llvm::TargetLoweringBase::getPreferredShiftAmountTy(), llvm::LLT::getScalarSizeInBits(), getTargetLowering(), llvm::MachineRegisterInfo::getType(), LHS, MI, MRI, RHS, and llvm::MachineIRBuilder::setInstrAndDebugLoc().
void CombinerHelper::applyXorOfAndWithSameReg | ( | MachineInstr & | MI, |
std::pair< Register, Register > & | MatchInfo | ||
) |
Definition at line 3026 of file CombinerHelper.cpp.
References Builder, llvm::MachineIRBuilder::buildNot(), llvm::GISelChangeObserver::changedInstr(), llvm::GISelChangeObserver::changingInstr(), llvm::MCInstrInfo::get(), llvm::MachineIRBuilder::getTII(), llvm::MachineRegisterInfo::getType(), MI, MRI, Observer, llvm::MachineIRBuilder::setInstrAndDebugLoc(), X, and Y.
MachineInstr * CombinerHelper::buildUDivUsingMul | ( | MachineInstr & | MI | ) |
Given an G_UDIV MI
expressing a divide by constant, return an expression that implements it by multiplying by a magic number.
Ref: "Hacker's Delight" or "The PowerPC Compiler Writer's Guide".
Definition at line 4761 of file CombinerHelper.cpp.
References assert(), Builder, llvm::LLT::changeElementSize(), llvm::APInt::countTrailingZeros(), llvm::UnsignedDivisonByConstantInfo::get(), llvm::APInt::getBitWidth(), llvm::APInt::getOneBitSet(), llvm::TargetLoweringBase::getPreferredShiftAmountTy(), llvm::LLT::getScalarSizeInBits(), llvm::LLT::getScalarType(), getTargetLowering(), llvm::MachineRegisterInfo::getType(), llvm::APInt::getZero(), llvm::UnsignedDivisonByConstantInfo::IsAdd, llvm::APInt::isOneValue(), llvm::LLT::isScalar(), llvm::LLT::isVector(), LHS, llvm::APInt::lshr(), llvm::msf::Magic, llvm::UnsignedDivisonByConstantInfo::Magic, llvm::matchUnaryPredicate(), MI, MRI, RHS, llvm::LLT::scalar(), llvm::MachineIRBuilder::setInstrAndDebugLoc(), and llvm::UnsignedDivisonByConstantInfo::ShiftAmount.
Referenced by applyUDivByConst().
bool CombinerHelper::canCombineFMadOrFMA | ( | MachineInstr & | MI, |
bool & | AllowFusionGlobally, | ||
bool & | HasFMAD, | ||
bool & | Aggressive, | ||
bool | CanReassociate = false |
||
) |
Definition at line 5012 of file CombinerHelper.cpp.
References Aggressive, llvm::FPOpFusion::Fast, llvm::MachineRegisterInfo::getType(), isLegalOrBeforeLegalizer(), LI, MI, MRI, and Options.
Referenced by matchCombineFAddFMAFMulToFMadOrFMA(), matchCombineFAddFMulToFMadOrFMA(), matchCombineFAddFpExtFMulToFMadOrFMA(), matchCombineFAddFpExtFMulToFMadOrFMAAggressive(), matchCombineFSubFMulToFMadOrFMA(), matchCombineFSubFNegFMulToFMadOrFMA(), matchCombineFSubFpExtFMulToFMadOrFMA(), and matchCombineFSubFpExtFNegFMulToFMadOrFMA().
bool CombinerHelper::dominates | ( | const MachineInstr & | DefMI, |
const MachineInstr & | UseMI | ||
) |
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 759 of file CombinerHelper.cpp.
References assert(), DefMI, llvm::MachineDominatorTree::dominates(), isPredecessor(), MDT, and UseMI.
Referenced by applyCombineDivRem().
bool CombinerHelper::eraseInst | ( | MachineInstr & | MI | ) |
|
inline |
Definition at line 125 of file CombinerHelper.h.
References KB.
Referenced by AMDGPUPostLegalizerCombinerHelper::matchUCharToFloat().
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.
Definition at line 187 of file CombinerHelper.cpp.
References llvm::RegisterBankInfo::getRegBank(), MRI, RBI, and TRI.
Referenced by matchPtrAddImmedChain().
const TargetLowering & CombinerHelper::getTargetLowering | ( | ) | const |
Definition at line 58 of file CombinerHelper.cpp.
References Builder, llvm::MachineIRBuilder::getMF(), llvm::MachineFunction::getSubtarget(), and llvm::TargetSubtargetInfo::getTargetLowering().
Referenced by applyOptBrCondByInvertingCond(), applyUMulHToLShr(), buildUDivUsingMul(), matchBitfieldExtractFromAnd(), matchBitfieldExtractFromSExtInReg(), matchBitfieldExtractFromShr(), matchBitfieldExtractFromShrAnd(), matchCombineShlOfExtend(), matchCombineTruncOfShl(), matchExtractVecEltBuildVec(), matchICmpToLHSKnownBits(), matchICmpToTrueFalseKnownBits(), matchLoadOrCombine(), matchNarrowBinopFeedingAnd(), matchTruncStoreMerge(), matchUDivByConst(), and matchUMulHToLShr().
Ty
is a legal integer constant type on the target. Definition at line 144 of file CombinerHelper.cpp.
References llvm::LLT::getElementType(), isLegal(), isLegalOrBeforeLegalizer(), isPreLegalize(), and llvm::LLT::isVector().
Referenced by matchAddOBy0(), and matchMulOBy0().
bool CombinerHelper::isLegal | ( | const LegalityQuery & | Query | ) | const |
Query
is legal on the target. Definition at line 134 of file CombinerHelper.cpp.
References llvm::LegalizeActionStep::Action, assert(), llvm::LegalizerInfo::getAction(), llvm::LegalizeActions::Legal, and LI.
Referenced by isConstantLegalOrBeforeLegalizer(), and isLegalOrBeforeLegalizer().
bool CombinerHelper::isLegalOrBeforeLegalizer | ( | const LegalityQuery & | Query | ) | const |
Query
is legal on the target. Definition at line 139 of file CombinerHelper.cpp.
References isLegal(), and isPreLegalize().
Referenced by canCombineFMadOrFMA(), isConstantLegalOrBeforeLegalizer(), matchAshrShlToSextInreg(), matchCombineDivRem(), matchCombineLoadWithAndMask(), matchCombineShlOfExtend(), matchCombineTruncOfShl(), matchExtractVecEltBuildVec(), matchFunnelShiftToRotate(), matchHoistLogicOpWithSameOpcodeHands(), matchICmpToLHSKnownBits(), matchLoadOrCombine(), matchNarrowBinopFeedingAnd(), matchOrShiftToFunnelShift(), matchRedundantNegOperands(), matchSextInRegOfLoad(), matchTruncStoreMerge(), matchUDivByConst(), and matchUMulHToLShr().
bool CombinerHelper::isPredecessor | ( | const MachineInstr & | DefMI, |
const MachineInstr & | UseMI | ||
) |
Returns true if DefMI
precedes UseMI
or they are the same instruction.
Both must be in the same basic block.
Definition at line 743 of file CombinerHelper.cpp.
References assert(), DefMI, llvm::MachineBasicBlock::end(), llvm::find_if(), llvm_unreachable, MBB, MI, and UseMI.
Referenced by dominates().
bool CombinerHelper::isPreLegalize | ( | ) | const |
Definition at line 132 of file CombinerHelper.cpp.
References LI.
Referenced by isConstantLegalOrBeforeLegalizer(), and isLegalOrBeforeLegalizer().
bool CombinerHelper::matchAddOBy0 | ( | MachineInstr & | MI, |
BuildFnTy & | MatchInfo | ||
) |
Match: (G_*ADDO x, 0) -> x + no carry out.
Definition at line 4743 of file CombinerHelper.cpp.
References assert(), B, llvm::MachineRegisterInfo::getType(), isConstantLegalOrBeforeLegalizer(), LHS, llvm::MIPatternMatch::m_SpecificICstOrSplat(), MI, llvm::MIPatternMatch::mi_match(), and MRI.
bool CombinerHelper::matchAllExplicitUsesAreUndef | ( | MachineInstr & | MI | ) |
Return true if all register explicit use operands on MI
are defined by a G_IMPLICIT_DEF.
Definition at line 2287 of file CombinerHelper.cpp.
References llvm::all_of(), and MI.
bool CombinerHelper::matchAndOrDisjointMask | ( | MachineInstr & | MI, |
BuildFnTy & | MatchInfo | ||
) |
Definition at line 4216 of file CombinerHelper.cpp.
References assert(), B, llvm::GISelChangeObserver::changedInstr(), llvm::GISelChangeObserver::changingInstr(), llvm::MachineRegisterInfo::getType(), llvm::LLT::isVector(), llvm::MIPatternMatch::m_all_of(), llvm::MIPatternMatch::m_GAnd(), llvm::MIPatternMatch::m_GOr(), llvm::MIPatternMatch::m_ICst(), llvm::MIPatternMatch::m_Reg(), MI, llvm::MIPatternMatch::mi_match(), MRI, and Observer.
bool CombinerHelper::matchAnyExplicitUseIsUndef | ( | MachineInstr & | MI | ) |
Return true if any explicit use operand on MI
is defined by a G_IMPLICIT_DEF.
Definition at line 2280 of file CombinerHelper.cpp.
References llvm::any_of(), and MI.
bool CombinerHelper::matchAshrShlToSextInreg | ( | MachineInstr & | MI, |
std::tuple< Register, int64_t > & | MatchInfo | ||
) |
Match ashr (shl x, C), C -> sext_inreg (C)
Definition at line 2713 of file CombinerHelper.cpp.
References assert(), llvm::MachineRegisterInfo::getType(), isLegalOrBeforeLegalizer(), llvm::MIPatternMatch::m_GAShr(), llvm::MIPatternMatch::m_GShl(), llvm::MIPatternMatch::m_ICst(), llvm::MIPatternMatch::m_Reg(), MI, llvm::MIPatternMatch::mi_match(), and MRI.
bool CombinerHelper::matchBinOpSameVal | ( | MachineInstr & | MI | ) |
Optimize (x op x) -> x.
Definition at line 2462 of file CombinerHelper.cpp.
References llvm::canReplaceReg(), matchEqualDefs(), MI, and MRI.
bool CombinerHelper::matchBitfieldExtractFromAnd | ( | MachineInstr & | MI, |
BuildFnTy & | MatchInfo | ||
) |
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 4280 of file CombinerHelper.cpp.
References assert(), B, llvm::APInt::countTrailingOnes(), llvm::TargetLoweringBase::getPreferredShiftAmountTy(), llvm::LLT::getScalarSizeInBits(), getTargetLowering(), llvm::MachineRegisterInfo::getType(), llvm::MIPatternMatch::m_GAnd(), llvm::MIPatternMatch::m_GLShr(), llvm::MIPatternMatch::m_ICst(), llvm::MIPatternMatch::m_OneNonDBGUse(), llvm::MIPatternMatch::m_Reg(), MI, llvm::MIPatternMatch::mi_match(), and MRI.
bool CombinerHelper::matchBitfieldExtractFromSExtInReg | ( | MachineInstr & | MI, |
BuildFnTy & | MatchInfo | ||
) |
Form a G_SBFX from a G_SEXT_INREG fed by a right shift.
Definition at line 4251 of file CombinerHelper.cpp.
References assert(), llvm::TargetLoweringBase::getPreferredShiftAmountTy(), getTargetLowering(), llvm::MachineRegisterInfo::getType(), llvm::LegalizerInfo::isLegalOrCustom(), LI, MI, and MRI.
bool CombinerHelper::matchBitfieldExtractFromShr | ( | MachineInstr & | MI, |
BuildFnTy & | MatchInfo | ||
) |
Match: shr (shl x, n), k -> sbfx/ubfx x, pos, width.
Definition at line 4316 of file CombinerHelper.cpp.
References assert(), llvm::TargetLoweringBase::getPreferredShiftAmountTy(), getTargetLowering(), llvm::MachineRegisterInfo::getType(), llvm::LegalizerInfo::isLegalOrCustom(), LI, MI, and MRI.
bool CombinerHelper::matchBitfieldExtractFromShrAnd | ( | MachineInstr & | MI, |
BuildFnTy & | MatchInfo | ||
) |
Match: shr (and x, n), k -> ubfx x, pos, width.
Definition at line 4365 of file CombinerHelper.cpp.
References assert(), B, llvm::countTrailingOnes(), llvm::TargetLoweringBase::getPreferredShiftAmountTy(), llvm::LLT::getScalarSizeInBits(), getTargetLowering(), llvm::MachineRegisterInfo::getType(), llvm::isMask_64(), llvm::MIPatternMatch::m_BinOp(), llvm::MIPatternMatch::m_GAnd(), llvm::MIPatternMatch::m_ICst(), llvm::MIPatternMatch::m_OneNonDBGUse(), llvm::MIPatternMatch::m_Reg(), MI, llvm::MIPatternMatch::mi_match(), and MRI.
bool CombinerHelper::matchCombineAddP2IToPtrAdd | ( | MachineInstr & | MI, |
std::pair< Register, bool > & | PtrRegAndCommute | ||
) |
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 2013 of file CombinerHelper.cpp.
References assert(), llvm::LLT::getScalarSizeInBits(), llvm::MachineRegisterInfo::getType(), LHS, llvm::MIPatternMatch::m_GPtrToInt(), llvm::MIPatternMatch::m_Reg(), MI, llvm::MIPatternMatch::mi_match(), MRI, and RHS.
bool CombinerHelper::matchCombineAnyExtTrunc | ( | MachineInstr & | MI, |
Register & | Reg | ||
) |
Transform anyext(trunc(x)) to x.
Definition at line 2088 of file CombinerHelper.cpp.
References assert(), llvm::MachineRegisterInfo::getType(), llvm::MIPatternMatch::m_all_of(), llvm::MIPatternMatch::m_GTrunc(), llvm::MIPatternMatch::m_Reg(), llvm::MIPatternMatch::m_SpecificType(), MI, llvm::MIPatternMatch::mi_match(), and MRI.
bool CombinerHelper::matchCombineConcatVectors | ( | MachineInstr & | MI, |
bool & | IsUndef, | ||
SmallVectorImpl< Register > & | Ops | ||
) |
Check if the G_CONCAT_VECTORS MI
is undef or if it can be flattened into a build_vector.
In the first case IsUndef
will be true. In the second case Ops
will contain the operands needed to produce the flattened build_vector.
Definition at line 227 of file CombinerHelper.cpp.
References assert(), Builder, llvm::MachineIRBuilder::buildUndef(), llvm::tgtok::Def, llvm::LLT::getNumElements(), llvm::LLT::getScalarType(), llvm::MachineRegisterInfo::getType(), llvm::MachineRegisterInfo::getVRegDef(), MI, MRI, llvm::MachineIRBuilder::setInsertPt(), and llvm::RegState::Undef.
Referenced by tryCombineConcatVectors().
bool CombinerHelper::matchCombineConstantFoldFpUnary | ( | MachineInstr & | MI, |
Optional< APFloat > & | Cst | ||
) |
Transform fp_instr(cst) to constant result of the fp operation.
Definition at line 1288 of file CombinerHelper.cpp.
References constantFoldFpUnary(), llvm::MachineRegisterInfo::getType(), llvm::Optional< T >::hasValue(), MI, and MRI.
bool CombinerHelper::matchCombineConstPtrAddToI2P | ( | MachineInstr & | MI, |
APInt & | NewCst | ||
) |
Definition at line 2057 of file CombinerHelper.cpp.
References Builder, llvm::getIConstantVRegVal(), llvm::MachineIRBuilder::getMF(), llvm::MachineFunction::getRegInfo(), llvm::MachineRegisterInfo::getType(), LHS, llvm::MIPatternMatch::m_GIntToPtr(), llvm::MIPatternMatch::m_ICst(), MI, llvm::MIPatternMatch::mi_match(), MRI, RHS, llvm::APInt::sextOrTrunc(), and llvm::APInt::zextOrTrunc().
bool CombinerHelper::matchCombineCopy | ( | MachineInstr & | MI | ) |
Definition at line 203 of file CombinerHelper.cpp.
References llvm::canReplaceReg(), MI, and MRI.
Referenced by tryCombineCopy().
bool CombinerHelper::matchCombineDivRem | ( | MachineInstr & | MI, |
MachineInstr *& | OtherMI | ||
) |
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 1070 of file CombinerHelper.cpp.
References llvm::MachineRegisterInfo::getType(), isLegalOrBeforeLegalizer(), llvm_unreachable, matchEqualDefs(), MI, MRI, llvm::MachineRegisterInfo::use_nodbg_instructions(), and UseMI.
bool CombinerHelper::matchCombineExtendingLoads | ( | MachineInstr & | MI, |
PreferredTuple & | MatchInfo | ||
) |
Definition at line 488 of file CombinerHelper.cpp.
References llvm::LegalizerInfo::getAction(), llvm::GAnyLoad::getDstReg(), llvm::GLoadStore::getMMO(), llvm::GLoadStore::getPointerReg(), llvm::MachineInstrBuilder::getReg(), llvm::LLT::getSizeInBits(), llvm::MachineRegisterInfo::getType(), llvm::isPowerOf2_32(), llvm::LLT::isScalar(), llvm::LegalizeActions::Legal, LI, MI, MRI, llvm::MachineRegisterInfo::use_nodbg_instructions(), and UseMI.
Referenced by tryCombineExtendingLoads().
bool CombinerHelper::matchCombineExtOfExt | ( | MachineInstr & | MI, |
std::tuple< Register, unsigned > & | MatchInfo | ||
) |
Transform [asz]ext([asz]ext(x)) to [asz]ext x.
Definition at line 2111 of file CombinerHelper.cpp.
References assert(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), llvm::MachineRegisterInfo::getVRegDef(), MI, and MRI.
bool CombinerHelper::matchCombineFAbsOfFAbs | ( | MachineInstr & | MI, |
Register & | Src | ||
) |
Match fabs(fabs(x)) to fabs(x).
Definition at line 2181 of file CombinerHelper.cpp.
References assert(), llvm::MIPatternMatch::m_GFabs(), llvm::MIPatternMatch::m_Reg(), MI, llvm::MIPatternMatch::mi_match(), and MRI.
bool CombinerHelper::matchCombineFAbsOfFNeg | ( | MachineInstr & | MI, |
BuildFnTy & | MatchInfo | ||
) |
Transform fabs(fneg(x)) to fabs(x).
Definition at line 2188 of file CombinerHelper.cpp.
References assert(), B, llvm::GISelChangeObserver::changedInstr(), llvm::GISelChangeObserver::changingInstr(), llvm::MIPatternMatch::m_GFNeg(), llvm::MIPatternMatch::m_Reg(), MI, llvm::MIPatternMatch::mi_match(), MRI, and Observer.
bool CombinerHelper::matchCombineFAddFMAFMulToFMadOrFMA | ( | MachineInstr & | MI, |
BuildFnTy & | MatchInfo | ||
) |
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 5152 of file CombinerHelper.cpp.
References Aggressive, assert(), B, canCombineFMadOrFMA(), llvm::MachineRegisterInfo::createGenericVirtualRegister(), llvm::ISD::FMA, llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), llvm::MachineRegisterInfo::getType(), llvm::MachineRegisterInfo::getVRegDef(), hasMoreUses(), llvm::MachineRegisterInfo::hasOneNonDBGUse(), isContractableFMul(), LHS, MI, MRI, RHS, std::swap(), X, and Y.
bool CombinerHelper::matchCombineFAddFMulToFMadOrFMA | ( | MachineInstr & | MI, |
BuildFnTy & | MatchInfo | ||
) |
Transform (fadd (fmul x, y), z) -> (fma x, y, z) (fadd (fmul x, y), z) -> (fmad x, y, z)
Definition at line 5045 of file CombinerHelper.cpp.
References Aggressive, assert(), B, canCombineFMadOrFMA(), llvm::MachineRegisterInfo::getVRegDef(), hasMoreUses(), llvm::MachineRegisterInfo::hasOneNonDBGUse(), isContractableFMul(), LHS, MI, MRI, RHS, and std::swap().
bool CombinerHelper::matchCombineFAddFpExtFMulToFMadOrFMA | ( | MachineInstr & | MI, |
BuildFnTy & | MatchInfo | ||
) |
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 5093 of file CombinerHelper.cpp.
References Aggressive, assert(), B, canCombineFMadOrFMA(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), llvm::MachineRegisterInfo::getType(), llvm::MachineRegisterInfo::getVRegDef(), hasMoreUses(), isContractableFMul(), LHS, llvm::MIPatternMatch::m_GFPExt(), llvm::MIPatternMatch::m_MInstr(), MI, llvm::MIPatternMatch::mi_match(), MRI, RHS, and std::swap().
bool CombinerHelper::matchCombineFAddFpExtFMulToFMadOrFMAAggressive | ( | MachineInstr & | MI, |
BuildFnTy & | MatchInfo | ||
) |
Definition at line 5217 of file CombinerHelper.cpp.
References Aggressive, assert(), B, canCombineFMadOrFMA(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), getReg(), llvm::MachineRegisterInfo::getType(), llvm::MachineRegisterInfo::getVRegDef(), hasMoreUses(), isContractableFMul(), LHS, llvm::MIPatternMatch::m_GFPExt(), llvm::MIPatternMatch::m_MInstr(), MI, llvm::MIPatternMatch::mi_match(), MRI, RHS, std::swap(), X, and Y.
bool CombinerHelper::matchCombineFMinMaxNaN | ( | MachineInstr & | MI, |
unsigned & | Info | ||
) |
Definition at line 5608 of file CombinerHelper.cpp.
References llvm::getConstantFPVRegVal(), llvm::ConstantFP::getValueAPF(), llvm::APFloat::isNaN(), MI, and MRI.
bool CombinerHelper::matchCombineFNegOfFNeg | ( | MachineInstr & | MI, |
Register & | Reg | ||
) |
Transform fneg(fneg(x)) to x.
Definition at line 2175 of file CombinerHelper.cpp.
References assert(), llvm::MIPatternMatch::m_GFNeg(), llvm::MIPatternMatch::m_Reg(), MI, llvm::MIPatternMatch::mi_match(), and MRI.
bool CombinerHelper::matchCombineFSubFMulToFMadOrFMA | ( | MachineInstr & | MI, |
BuildFnTy & | MatchInfo | ||
) |
Transform (fsub (fmul x, y), z) -> (fma x, y, -z) (fsub (fmul x, y), z) -> (fmad x, y, -z)
Definition at line 5343 of file CombinerHelper.cpp.
References Aggressive, assert(), B, canCombineFMadOrFMA(), getReg(), llvm::MachineRegisterInfo::getType(), llvm::MachineRegisterInfo::getVRegDef(), hasMoreUses(), llvm::MachineRegisterInfo::hasOneNonDBGUse(), isContractableFMul(), LHS, MI, MRI, and RHS.
bool CombinerHelper::matchCombineFSubFNegFMulToFMadOrFMA | ( | MachineInstr & | MI, |
BuildFnTy & | MatchInfo | ||
) |
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 5395 of file CombinerHelper.cpp.
References Aggressive, assert(), B, canCombineFMadOrFMA(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), getReg(), llvm::MachineRegisterInfo::getType(), llvm::MachineRegisterInfo::hasOneNonDBGUse(), isContractableFMul(), llvm::MIPatternMatch::m_GFNeg(), llvm::MIPatternMatch::m_MInstr(), MI, llvm::MIPatternMatch::mi_match(), and MRI.
bool CombinerHelper::matchCombineFSubFpExtFMulToFMadOrFMA | ( | MachineInstr & | MI, |
BuildFnTy & | MatchInfo | ||
) |
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 5442 of file CombinerHelper.cpp.
References Aggressive, assert(), B, canCombineFMadOrFMA(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), getReg(), llvm::MachineRegisterInfo::getType(), llvm::MachineRegisterInfo::hasOneNonDBGUse(), isContractableFMul(), llvm::MIPatternMatch::m_GFPExt(), llvm::MIPatternMatch::m_MInstr(), MI, llvm::MIPatternMatch::mi_match(), and MRI.
bool CombinerHelper::matchCombineFSubFpExtFNegFMulToFMadOrFMA | ( | MachineInstr & | MI, |
BuildFnTy & | MatchInfo | ||
) |
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 5493 of file CombinerHelper.cpp.
References Aggressive, assert(), B, canCombineFMadOrFMA(), llvm::MachineRegisterInfo::createGenericVirtualRegister(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), llvm::MachineRegisterInfo::getType(), isContractableFMul(), llvm::MIPatternMatch::m_GFNeg(), llvm::MIPatternMatch::m_GFPExt(), llvm::MIPatternMatch::m_MInstr(), MI, llvm::MIPatternMatch::mi_match(), MRI, X, and Y.
bool CombinerHelper::matchCombineI2PToP2I | ( | MachineInstr & | MI, |
Register & | Reg | ||
) |
Transform IntToPtr(PtrToInt(x)) to x if cast is in the same address space.
Definition at line 1982 of file CombinerHelper.cpp.
References assert(), llvm::MachineRegisterInfo::getType(), llvm::MIPatternMatch::m_all_of(), llvm::MIPatternMatch::m_GPtrToInt(), llvm::MIPatternMatch::m_Reg(), llvm::MIPatternMatch::m_SpecificType(), MI, llvm::MIPatternMatch::mi_match(), and MRI.
bool CombinerHelper::matchCombineIndexedLoadStore | ( | MachineInstr & | MI, |
IndexedLoadStoreMatchInfo & | MatchInfo | ||
) |
Definition at line 1007 of file CombinerHelper.cpp.
References llvm::IndexedLoadStoreMatchInfo::Addr, llvm::IndexedLoadStoreMatchInfo::Base, ForceLegalIndexing, llvm::IndexedLoadStoreMatchInfo::IsPre, MI, and llvm::IndexedLoadStoreMatchInfo::Offset.
Referenced by tryCombineIndexedLoadStore().
bool CombinerHelper::matchCombineInsertVecElts | ( | MachineInstr & | MI, |
SmallVectorImpl< Register > & | MatchInfo | ||
) |
Definition at line 2538 of file CombinerHelper.cpp.
References assert(), llvm::LLT::getNumElements(), llvm::MachineInstr::getNumOperands(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), llvm::MachineRegisterInfo::getType(), llvm::MachineRegisterInfo::hasOneUse(), I, isValid(), llvm::LLT::isVector(), llvm::MIPatternMatch::m_GInsertVecElt(), llvm::MIPatternMatch::m_ICst(), llvm::MIPatternMatch::m_MInstr(), llvm::MIPatternMatch::m_Reg(), MI, llvm::MIPatternMatch::mi_match(), MRI, llvm::SmallVectorImpl< T >::resize(), and llvm::MachineRegisterInfo::use_instr_begin().
bool CombinerHelper::matchCombineLoadWithAndMask | ( | MachineInstr & | MI, |
BuildFnTy & | MatchInfo | ||
) |
Match (and (load x), mask) -> zextload x.
Definition at line 673 of file CombinerHelper.cpp.
References assert(), B, llvm::APInt::countTrailingOnes(), llvm::GAnyLoad::getDstReg(), llvm::getIConstantVRegValWithLookThrough(), llvm::GLoadStore::getMemSizeInBits(), llvm::GLoadStore::getMMO(), llvm::MachineMemOperand::getPointerInfo(), llvm::GLoadStore::getPointerReg(), llvm::LLT::getSizeInBits(), llvm::MachineRegisterInfo::getType(), llvm::MachineRegisterInfo::hasOneNonDBGUse(), isLegalOrBeforeLegalizer(), llvm::APInt::isMask(), llvm::isPowerOf2_32(), llvm::GLoadStore::isSimple(), llvm::LLT::isVector(), llvm::LegalityQuery::MemDesc::MemoryTy, MI, MRI, and llvm::LLT::scalar().
bool CombinerHelper::matchCombineMergeUnmerge | ( | MachineInstr & | MI, |
Register & | MatchInfo | ||
) |
Fold away a merge of an unmerge of the corresponding values.
Definition at line 1652 of file CombinerHelper.cpp.
References llvm::SmallVectorImpl< T >::emplace_back(), I, Merge, MI, and MRI.
bool CombinerHelper::matchCombineMulToShl | ( | MachineInstr & | MI, |
unsigned & | ShiftVal | ||
) |
Transform a multiply by a power-of-2 value to a left shift.
Definition at line 1576 of file CombinerHelper.cpp.
References assert(), llvm::getIConstantVRegValWithLookThrough(), MI, and MRI.
bool CombinerHelper::matchCombineP2IToI2P | ( | MachineInstr & | MI, |
Register & | Reg | ||
) |
Transform PtrToInt(IntToPtr(x)) to x.
Definition at line 1999 of file CombinerHelper.cpp.
References assert(), llvm::MIPatternMatch::m_GIntToPtr(), llvm::MIPatternMatch::m_Reg(), MI, llvm::MIPatternMatch::mi_match(), and MRI.
bool CombinerHelper::matchCombineShiftToUnmerge | ( | MachineInstr & | MI, |
unsigned | TargetShiftSize, | ||
unsigned & | ShiftVal | ||
) |
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 1873 of file CombinerHelper.cpp.
References assert(), llvm::getIConstantVRegValWithLookThrough(), llvm::LLT::getSizeInBits(), llvm::MachineRegisterInfo::getType(), llvm::LLT::isVector(), MI, and MRI.
Referenced by tryCombineShiftToUnmerge().
bool CombinerHelper::matchCombineShlOfExtend | ( | MachineInstr & | MI, |
RegisterImmPair & | MatchData | ||
) |
Definition at line 1601 of file CombinerHelper.cpp.
References assert(), llvm::APInt::countLeadingOnes(), llvm::getIConstantVRegValWithLookThrough(), llvm::GISelKnownBits::getKnownZeroes(), llvm::TargetLoweringBase::getPreferredShiftAmountTy(), getTargetLowering(), llvm::MachineRegisterInfo::getType(), llvm::RegisterImmPair::Imm, isLegalOrBeforeLegalizer(), KB, LHS, LI, llvm::MIPatternMatch::m_GAnyExt(), llvm::MIPatternMatch::m_GSExt(), llvm::MIPatternMatch::m_GZExt(), llvm::MIPatternMatch::m_Reg(), MI, llvm::MIPatternMatch::mi_match(), MRI, llvm::RegisterImmPair::Reg, and RHS.
bool CombinerHelper::matchCombineShuffleVector | ( | MachineInstr & | MI, |
SmallVectorImpl< Register > & | Ops | ||
) |
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.
Definition at line 303 of file CombinerHelper.cpp.
References assert(), Builder, llvm::MachineIRBuilder::buildUndef(), llvm::LLT::getNumElements(), llvm::MachineInstrBuilder::getReg(), llvm::MachineRegisterInfo::getType(), i, llvm::LLT::isVector(), llvm::BitmaskEnumDetail::Mask(), MI, MRI, and llvm::MachineIRBuilder::setInsertPt().
Referenced by tryCombineShuffleVector().
bool CombinerHelper::matchCombineTruncOfExt | ( | MachineInstr & | MI, |
std::pair< Register, unsigned > & | MatchInfo | ||
) |
Transform trunc ([asz]ext x) to x or ([asz]ext x) or (trunc x).
Definition at line 2205 of file CombinerHelper.cpp.
References assert(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), llvm::MachineRegisterInfo::getVRegDef(), MI, and MRI.
bool CombinerHelper::matchCombineTruncOfShl | ( | MachineInstr & | MI, |
std::pair< Register, Register > & | MatchInfo | ||
) |
Transform trunc (shl x, K) to shl (trunc x), K => K < VT.getScalarSizeInBits().
Definition at line 2240 of file CombinerHelper.cpp.
References assert(), llvm::KnownBits::countMaxActiveBits(), llvm::GISelKnownBits::getKnownBits(), llvm::TargetLoweringBase::getPreferredShiftAmountTy(), llvm::LLT::getSizeInBits(), getTargetLowering(), llvm::MachineRegisterInfo::getType(), llvm::MachineRegisterInfo::hasOneNonDBGUse(), isLegalOrBeforeLegalizer(), KB, llvm::Log2_32(), llvm::MIPatternMatch::m_GShl(), llvm::MIPatternMatch::m_Reg(), MI, llvm::MIPatternMatch::mi_match(), and MRI.
bool CombinerHelper::matchCombineUnmergeConstant | ( | MachineInstr & | MI, |
SmallVectorImpl< APInt > & | Csts | ||
) |
Transform G_UNMERGE Constant -> Constant1, Constant2, ...
Definition at line 1726 of file CombinerHelper.cpp.
References llvm::APFloat::bitcastToAPInt(), llvm::SmallVectorImpl< T >::emplace_back(), llvm::MachineOperand::getCImm(), llvm::MachineOperand::getFPImm(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::LLT::getSizeInBits(), llvm::MachineRegisterInfo::getType(), llvm::ConstantInt::getValue(), llvm::ConstantFP::getValueAPF(), llvm::MachineRegisterInfo::getVRegDef(), llvm::APInt::lshr(), MI, MRI, and llvm::APInt::trunc().
bool CombinerHelper::matchCombineUnmergeMergeToPlainValues | ( | MachineInstr & | MI, |
SmallVectorImpl< Register > & | Operands | ||
) |
Transform <ty,...> G_UNMERGE(G_MERGE ty X, Y, Z) -> ty X, Y, Z.
Definition at line 1679 of file CombinerHelper.cpp.
References assert(), llvm::LLT::getSizeInBits(), llvm::MachineRegisterInfo::getType(), MI, MRI, Operands, and peekThroughBitcast().
bool CombinerHelper::matchCombineUnmergeUndef | ( | MachineInstr & | MI, |
std::function< void(MachineIRBuilder &)> & | MatchInfo | ||
) |
Transform G_UNMERGE G_IMPLICIT_DEF -> G_IMPLICIT_DEF, G_IMPLICIT_DEF, ...
Definition at line 1767 of file CombinerHelper.cpp.
References B, llvm::MachineRegisterInfo::getVRegDef(), MI, and MRI.
bool CombinerHelper::matchCombineUnmergeWithDeadLanesToTrunc | ( | MachineInstr & | MI | ) |
Transform X, Y<dead> = G_UNMERGE Z -> X = G_TRUNC Z.
Definition at line 1781 of file CombinerHelper.cpp.
References assert(), MI, MRI, and llvm::MachineRegisterInfo::use_nodbg_empty().
bool CombinerHelper::matchCombineUnmergeZExtToZExt | ( | MachineInstr & | MI | ) |
Transform X, Y = G_UNMERGE(G_ZEXT(Z)) -> X = G_ZEXT(Z); Y = G_CONSTANT 0.
Definition at line 1813 of file CombinerHelper.cpp.
References assert(), llvm::LLT::getSizeInBits(), llvm::MachineRegisterInfo::getType(), llvm::LLT::isVector(), llvm::MIPatternMatch::m_GZExt(), llvm::MIPatternMatch::m_Reg(), MI, llvm::MIPatternMatch::mi_match(), and MRI.
bool CombinerHelper::matchCombineZextTrunc | ( | MachineInstr & | MI, |
Register & | Reg | ||
) |
Transform zext(trunc(x)) to x.
Definition at line 2097 of file CombinerHelper.cpp.
References assert(), llvm::KnownBits::countMinLeadingZeros(), llvm::GISelKnownBits::getKnownBits(), llvm::LLT::getScalarSizeInBits(), llvm::MachineRegisterInfo::getType(), KB, llvm::MIPatternMatch::m_all_of(), llvm::MIPatternMatch::m_GTrunc(), llvm::MIPatternMatch::m_Reg(), llvm::MIPatternMatch::m_SpecificType(), MI, llvm::MIPatternMatch::mi_match(), and MRI.
bool CombinerHelper::matchConstantFold | ( | MachineInstr & | MI, |
APInt & | MatchInfo | ||
) |
Do constant folding when opportunities are exposed after MIR building.
Definition at line 4606 of file CombinerHelper.cpp.
References llvm::ConstantFoldBinOp(), MI, and MRI.
bool CombinerHelper::matchConstantOp | ( | const MachineOperand & | MOP, |
int64_t | C | ||
) |
Return true if MOP
is defined by a G_CONSTANT with a value equal to C
.
Definition at line 2424 of file CombinerHelper.cpp.
References llvm::MachineOperand::getReg(), llvm::MachineRegisterInfo::getVRegDef(), llvm::isConstantOrConstantSplatVector(), llvm::MachineOperand::isReg(), MI, and MRI.
Referenced by matchOperandIsZero().
bool CombinerHelper::matchConstantSelectCmp | ( | MachineInstr & | MI, |
unsigned & | OpIdx | ||
) |
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 2312 of file CombinerHelper.cpp.
References llvm::GSelect::getCondReg(), llvm::MachineRegisterInfo::getVRegDef(), llvm::isConstantOrConstantSplatVector(), MI, and MRI.
bool CombinerHelper::matchEqualDefs | ( | const MachineOperand & | MOP1, |
const MachineOperand & | MOP2 | ||
) |
Return true if MOP1
and MOP2
are register operands are defined by equivalent instructions.
Definition at line 2327 of file CombinerHelper.cpp.
References llvm::any_of(), Builder, llvm::MachineInstr::findRegisterDefOperandIdx(), llvm::getDefSrcRegIgnoringCopies(), llvm::GLoadStore::getMemSizeInBits(), llvm::MachineOperand::getReg(), llvm::MachineIRBuilder::getTII(), I1, llvm::MachineInstr::isDereferenceableInvariantLoad(), llvm::MachineOperand::isReg(), llvm::MachineInstr::mayLoadOrStore(), MRI, and llvm::TargetInstrInfo::produceSameValue().
Referenced by matchBinOpSameVal(), matchCombineDivRem(), matchHoistLogicOpWithSameOpcodeHands(), and matchSelectSameVal().
bool CombinerHelper::matchExtendThroughPhis | ( | MachineInstr & | MI, |
MachineInstr *& | ExtMI | ||
) |
Definition at line 3790 of file CombinerHelper.cpp.
References assert(), Builder, DefMI, llvm::getDefIgnoringCopies(), llvm::MachineInstr::getOpcode(), llvm::MachineIRBuilder::getTII(), llvm::MachineRegisterInfo::getType(), llvm::MachineRegisterInfo::hasOneNonDBGUse(), llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::TargetInstrInfo::isExtendLikelyToBeFolded(), llvm::LLT::isVector(), MI, MRI, llvm::SmallPtrSetImplBase::size(), and llvm::MachineRegisterInfo::use_instr_nodbg_begin().
bool CombinerHelper::matchExtractAllEltsFromBuildVector | ( | MachineInstr & | MI, |
SmallVectorImpl< std::pair< Register, MachineInstr * >> & | MatchInfo | ||
) |
Definition at line 3945 of file CombinerHelper.cpp.
References llvm::SmallBitVector::all(), assert(), llvm::getIConstantVRegVal(), llvm::LLT::getNumElements(), llvm::MachineRegisterInfo::getType(), MI, MRI, llvm::SmallBitVector::set(), and llvm::MachineRegisterInfo::use_nodbg_instructions().
bool CombinerHelper::matchExtractVecEltBuildVec | ( | MachineInstr & | MI, |
Register & | Reg | ||
) |
Definition at line 3890 of file CombinerHelper.cpp.
References assert(), llvm::LLT::getElementType(), llvm::getIConstantVRegValWithLookThrough(), llvm::getMVTForLLT(), llvm::LLT::getNumElements(), llvm::getOpcodeDef(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), getTargetLowering(), llvm::MachineRegisterInfo::getType(), llvm::MachineRegisterInfo::hasOneNonDBGUse(), isLegalOrBeforeLegalizer(), MI, and MRI.
bool CombinerHelper::matchFoldBinOpIntoSelect | ( | MachineInstr & | MI, |
unsigned & | SelectOpNo | ||
) |
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 3081 of file CombinerHelper.cpp.
References llvm::MachineRegisterInfo::getVRegDef(), llvm::MachineRegisterInfo::hasOneNonDBGUse(), llvm::isAllOnesOrAllOnesSplat(), llvm::isConstantOrConstantVector(), llvm::isNullOrNullSplat(), LHS, MI, MRI, RHS, and llvm::MCID::Select.
bool CombinerHelper::matchFunnelShiftToRotate | ( | MachineInstr & | MI | ) |
Match an FSHL or FSHR that can be combined to a ROTR or ROTL rotate.
Definition at line 4066 of file CombinerHelper.cpp.
References assert(), llvm::MachineRegisterInfo::getType(), isLegalOrBeforeLegalizer(), MI, MRI, X, and Y.
bool CombinerHelper::matchHoistLogicOpWithSameOpcodeHands | ( | MachineInstr & | MI, |
InstructionStepsMatchInfo & | MatchInfo | ||
) |
Match (logic_op (op x...), (op y...)) -> (op (logic_op x, y))
Definition at line 2607 of file CombinerHelper.cpp.
References llvm::MachineInstrBuilder::addReg(), assert(), llvm::MachineRegisterInfo::createGenericVirtualRegister(), llvm::getDefIgnoringCopies(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), llvm::MachineRegisterInfo::getType(), llvm::MachineRegisterInfo::hasOneNonDBGUse(), isLegalOrBeforeLegalizer(), llvm::MachineOperand::isReg(), llvm::Register::isValid(), matchEqualDefs(), MI, MRI, X, and Y.
bool CombinerHelper::matchICmpToLHSKnownBits | ( | MachineInstr & | MI, |
BuildFnTy & | MatchInfo | ||
) |
MI
can be replaced with its LHS based off of KnownBits information. Definition at line 4173 of file CombinerHelper.cpp.
References assert(), B, llvm::getICmpTrueVal(), llvm::GISelKnownBits::getKnownBits(), llvm::LLT::getSizeInBits(), getTargetLowering(), llvm::MachineRegisterInfo::getType(), llvm::CmpInst::ICMP_EQ, llvm::CmpInst::isEquality(), isLegalOrBeforeLegalizer(), llvm::LLT::isVector(), KB, LHS, llvm::MIPatternMatch::m_SpecificICst(), MI, llvm::MIPatternMatch::mi_match(), and MRI.
bool CombinerHelper::matchICmpToTrueFalseKnownBits | ( | MachineInstr & | MI, |
int64_t & | MatchInfo | ||
) |
MI
can be replaced with a true or false constant based off of KnownBits information. Definition at line 4120 of file CombinerHelper.cpp.
References assert(), llvm::KnownBits::eq(), llvm::getICmpTrueVal(), llvm::GISelKnownBits::getKnownBits(), getTargetLowering(), llvm::MachineRegisterInfo::getType(), llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_NE, llvm::CmpInst::ICMP_SGE, llvm::CmpInst::ICMP_SGT, llvm::CmpInst::ICMP_SLE, llvm::CmpInst::ICMP_SLT, llvm::CmpInst::ICMP_UGE, llvm::CmpInst::ICMP_UGT, llvm::CmpInst::ICMP_ULE, llvm::CmpInst::ICMP_ULT, llvm::LLT::isVector(), KB, llvm_unreachable, MI, MRI, llvm::KnownBits::ne(), llvm::KnownBits::sge(), llvm::KnownBits::sgt(), llvm::KnownBits::sle(), llvm::KnownBits::slt(), llvm::KnownBits::uge(), llvm::KnownBits::ugt(), llvm::KnownBits::ule(), and llvm::KnownBits::ult().
bool CombinerHelper::matchLoadOrCombine | ( | MachineInstr & | MI, |
BuildFnTy & | MatchInfo | ||
) |
Match expression trees of the form.
And check if the tree can be replaced with a M-bit load + possibly a bswap.
Definition at line 3409 of file CombinerHelper.cpp.
References assert(), bigEndianByteAt(), llvm::MachineRegisterInfo::cloneVirtualRegister(), DL, llvm::DenseMapBase< SmallDenseMap< KeyT, ValueT, 4, DenseMapInfo< KeyT >, llvm::detail::DenseMapPair< KeyT, ValueT > >, KeyT, ValueT, DenseMapInfo< KeyT >, llvm::detail::DenseMapPair< KeyT, ValueT > >::end(), llvm::DenseMapBase< SmallDenseMap< KeyT, ValueT, 4, DenseMapInfo< KeyT >, llvm::detail::DenseMapPair< KeyT, ValueT > >, KeyT, ValueT, DenseMapInfo< KeyT >, llvm::detail::DenseMapPair< KeyT, ValueT > >::find(), llvm::Function::getContext(), llvm::MachineFunction::getDataLayout(), llvm::MachineFunction::getFunction(), llvm::MachineFunction::getMachineMemOperand(), llvm::GLoadStore::getMMO(), llvm::MachineMemOperand::getPointerInfo(), llvm::GLoadStore::getPointerReg(), llvm::LLT::getSizeInBits(), getTargetLowering(), llvm::MachineRegisterInfo::getType(), llvm::Optional< T >::hasValue(), isBigEndian(), llvm::DataLayout::isBigEndian(), isLegalOrBeforeLegalizer(), llvm::LLT::isVector(), littleEndianByteAt(), llvm::LegalityQuery::MemDesc::MemoryTy, MI, and MRI.
bool CombinerHelper::matchMulOBy0 | ( | MachineInstr & | MI, |
BuildFnTy & | MatchInfo | ||
) |
Match: (G_*MULO x, 0) -> 0 + no carry out.
Definition at line 4725 of file CombinerHelper.cpp.
References assert(), B, llvm::MachineRegisterInfo::getType(), isConstantLegalOrBeforeLegalizer(), llvm::MIPatternMatch::m_SpecificICstOrSplat(), MI, llvm::MIPatternMatch::mi_match(), and MRI.
bool CombinerHelper::matchMulOBy2 | ( | MachineInstr & | MI, |
BuildFnTy & | MatchInfo | ||
) |
Match: (G_UMULO x, 2) -> (G_UADDO x, x) (G_SMULO x, 2) -> (G_SADDO x, x)
Definition at line 4707 of file CombinerHelper.cpp.
References assert(), B, Builder, llvm::GISelChangeObserver::changedInstr(), llvm::GISelChangeObserver::changingInstr(), llvm::MCInstrInfo::get(), llvm::MachineIRBuilder::getTII(), llvm::MIPatternMatch::m_SpecificICstOrSplat(), MI, llvm::MIPatternMatch::mi_match(), MRI, and Observer.
bool CombinerHelper::matchNarrowBinopFeedingAnd | ( | MachineInstr & | MI, |
BuildFnTy & | MatchInfo | ||
) |
MI
. Definition at line 4616 of file CombinerHelper.cpp.
References assert(), B, Builder, llvm::MachineIRBuilder::buildInstr(), llvm::MachineIRBuilder::buildTrunc(), llvm::MachineIRBuilder::buildZExt(), llvm::GISelChangeObserver::changedInstr(), llvm::GISelChangeObserver::changingInstr(), DL, llvm::MipsISD::Ext, llvm::getDefIgnoringCopies(), llvm::getIConstantVRegValWithLookThrough(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), llvm::LLT::getSizeInBits(), getTargetLowering(), llvm::MachineRegisterInfo::getType(), llvm::MachineRegisterInfo::hasOneNonDBGUse(), isLegalOrBeforeLegalizer(), llvm::LLT::isScalar(), llvm::BitmaskEnumDetail::Mask(), MI, MRI, Observer, and llvm::LLT::scalar().
bool CombinerHelper::matchNotCmp | ( | MachineInstr & | MI, |
SmallVectorImpl< Register > & | RegsToNegate | ||
) |
Combine inverting a result of a compare into the opposite cond code.
Definition at line 2886 of file CombinerHelper.cpp.
References assert(), Builder, llvm::tgtok::Def, llvm::getIConstantSplatSExtVal(), llvm::MachineIRBuilder::getMF(), llvm::LLT::getScalarSizeInBits(), llvm::LLT::getSizeInBits(), llvm::MachineFunction::getSubtarget(), llvm::TargetSubtargetInfo::getTargetLowering(), llvm::MachineRegisterInfo::getType(), llvm::MachineRegisterInfo::getVRegDef(), llvm::MachineRegisterInfo::hasOneNonDBGUse(), I, isConstValidTrue(), llvm::LLT::isVector(), llvm::MIPatternMatch::m_GXor(), llvm::MIPatternMatch::m_ICst(), llvm::MIPatternMatch::m_Reg(), MI, llvm::MIPatternMatch::mi_match(), and MRI.
bool CombinerHelper::matchOperandIsKnownToBeAPowerOfTwo | ( | MachineInstr & | MI, |
unsigned | OpIdx | ||
) |
Check if operand OpIdx
is known to be a power of 2.
Definition at line 2480 of file CombinerHelper.cpp.
References llvm::MachineOperand::getReg(), llvm::isKnownToBeAPowerOfTwo(), KB, MI, and MRI.
bool CombinerHelper::matchOperandIsUndef | ( | MachineInstr & | MI, |
unsigned | OpIdx | ||
) |
Check if operand OpIdx
is undef.
Definition at line 2474 of file CombinerHelper.cpp.
References llvm::getOpcodeDef(), llvm::MachineOperand::getReg(), llvm::MachineOperand::isReg(), MI, and MRI.
bool CombinerHelper::matchOperandIsZero | ( | MachineInstr & | MI, |
unsigned | OpIdx | ||
) |
Check if operand OpIdx
is zero.
Definition at line 2468 of file CombinerHelper.cpp.
References llvm::canReplaceReg(), matchConstantOp(), MI, and MRI.
bool CombinerHelper::matchOptBrCondByInvertingCond | ( | MachineInstr & | MI, |
MachineInstr *& | BrCond | ||
) |
If a brcond's true block is not the fallthrough, make it so by inverting the condition and swapping operands.
Definition at line 1164 of file CombinerHelper.cpp.
References assert(), llvm::MachineBasicBlock::begin(), llvm::MachineBasicBlock::end(), llvm::MachineOperand::getMBB(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MachineBasicBlock::isLayoutSuccessor(), MBB, and MI.
bool CombinerHelper::matchOrShiftToFunnelShift | ( | MachineInstr & | MI, |
BuildFnTy & | MatchInfo | ||
) |
Definition at line 4012 of file CombinerHelper.cpp.
References assert(), B, llvm::BitWidth, llvm::LLT::getScalarSizeInBits(), llvm::MachineRegisterInfo::getType(), isLegalOrBeforeLegalizer(), llvm::MIPatternMatch::m_GLShr(), llvm::MIPatternMatch::m_GOr(), llvm::MIPatternMatch::m_GShl(), llvm::MIPatternMatch::m_GSub(), llvm::MIPatternMatch::m_ICstOrSplat(), llvm::MIPatternMatch::m_Reg(), llvm::MIPatternMatch::m_SpecificICstOrSplat(), MI, llvm::MIPatternMatch::mi_match(), and MRI.
bool CombinerHelper::matchOverlappingAnd | ( | MachineInstr & | MI, |
BuildFnTy & | MatchInfo | ||
) |
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 2744 of file CombinerHelper.cpp.
References assert(), B, C1, llvm::MachineRegisterInfo::getType(), llvm::MIPatternMatch::m_GAnd(), llvm::MIPatternMatch::m_ICst(), llvm::MIPatternMatch::m_Reg(), MI, llvm::MIPatternMatch::mi_match(), MRI, and replaceRegWith().
bool CombinerHelper::matchPtrAddImmedChain | ( | MachineInstr & | MI, |
PtrAddChain & | MatchInfo | ||
) |
Definition at line 1308 of file CombinerHelper.cpp.
References llvm::PtrAddChain::Bank, llvm::sampleprof::Base, llvm::PtrAddChain::Base, llvm::TargetLoweringBase::AddrMode::BaseOffs, llvm::LLT::getAddressSpace(), llvm::getIConstantVRegValWithLookThrough(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), getRegBank(), llvm::APInt::getSExtValue(), llvm::MachineRegisterInfo::getType(), getTypeForLLT(), llvm::MachineRegisterInfo::getVRegDef(), llvm::TargetLoweringBase::AddrMode::HasBaseReg, llvm::PtrAddChain::Imm, MI, MRI, llvm::MachineRegisterInfo::use_nodbg_instructions(), and UseMI.
bool CombinerHelper::matchPtrAddZero | ( | MachineInstr & | MI | ) |
}
Combine G_PTR_ADD with nullptr to G_INTTOPTR
Definition at line 3040 of file CombinerHelper.cpp.
References assert(), Builder, DL, llvm::LLT::getAddressSpace(), llvm::MachineFunction::getDataLayout(), llvm::getIConstantVRegVal(), llvm::MachineIRBuilder::getMF(), llvm::LLT::getScalarType(), llvm::MachineRegisterInfo::getType(), llvm::MachineRegisterInfo::getVRegDef(), llvm::isBuildVectorAllZeros(), llvm::LLT::isPointer(), llvm::LLT::isVector(), MI, and MRI.
bool CombinerHelper::matchReassocConstantInnerLHS | ( | GPtrAdd & | MI, |
MachineInstr * | LHS, | ||
MachineInstr * | RHS, | ||
BuildFnTy & | MatchInfo | ||
) |
Definition at line 4515 of file CombinerHelper.cpp.
References B, llvm::GISelChangeObserver::changedInstr(), llvm::GISelChangeObserver::changingInstr(), LHS, llvm::MIPatternMatch::m_GCst(), llvm::MIPatternMatch::m_GPtrAdd(), llvm::MIPatternMatch::m_OneNonDBGUse(), llvm::MIPatternMatch::m_Reg(), MI, llvm::MIPatternMatch::mi_match(), MRI, Observer, and llvm::ValueAndVReg::VReg.
Referenced by matchReassocPtrAdd().
bool CombinerHelper::matchReassocConstantInnerRHS | ( | GPtrAdd & | MI, |
MachineInstr * | RHS, | ||
BuildFnTy & | MatchInfo | ||
) |
Definition at line 4491 of file CombinerHelper.cpp.
References B, Builder, llvm::MachineIRBuilder::buildPtrAdd(), llvm::GISelChangeObserver::changedInstr(), llvm::GISelChangeObserver::changingInstr(), llvm::getIConstantVRegVal(), llvm::MachineRegisterInfo::getType(), MI, MRI, Observer, and RHS.
Referenced by matchReassocPtrAdd().
bool CombinerHelper::matchReassocFoldConstantsInSubTree | ( | GPtrAdd & | MI, |
MachineInstr * | LHS, | ||
MachineInstr * | RHS, | ||
BuildFnTy & | MatchInfo | ||
) |
Definition at line 4544 of file CombinerHelper.cpp.
References B, C1, llvm::GISelChangeObserver::changedInstr(), llvm::GISelChangeObserver::changingInstr(), llvm::getIConstantVRegVal(), llvm::MachineRegisterInfo::getType(), LHS, MI, MRI, and Observer.
Referenced by matchReassocPtrAdd().
bool CombinerHelper::matchReassocPtrAdd | ( | MachineInstr & | MI, |
BuildFnTy & | MatchInfo | ||
) |
Reassociate pointer calculations with G_ADD involved, to allow better addressing mode usage.
Definition at line 4573 of file CombinerHelper.cpp.
References llvm::MachineRegisterInfo::getVRegDef(), LHS, matchReassocConstantInnerLHS(), matchReassocConstantInnerRHS(), matchReassocFoldConstantsInSubTree(), MI, MRI, and RHS.
bool CombinerHelper::matchRedundantAnd | ( | MachineInstr & | MI, |
Register & | Replacement | ||
) |
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.)[in] | MI | - The G_AND instruction. |
[out] | Replacement | - A register the G_AND should be replaced with on success. |
Definition at line 2770 of file CombinerHelper.cpp.
References assert(), llvm::canReplaceReg(), llvm::GISelKnownBits::getKnownBits(), llvm::MachineRegisterInfo::getType(), llvm::LLT::isVector(), KB, LHS, MI, MRI, llvm::KnownBits::One, RHS, and llvm::KnownBits::Zero.
bool CombinerHelper::matchRedundantNegOperands | ( | MachineInstr & | MI, |
BuildFnTy & | MatchInfo | ||
) |
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 4950 of file CombinerHelper.cpp.
References assert(), B, llvm::GISelChangeObserver::changedInstr(), llvm::GISelChangeObserver::changingInstr(), llvm::MachineRegisterInfo::getType(), isLegalOrBeforeLegalizer(), llvm::MIPatternMatch::m_GFAdd(), llvm::MIPatternMatch::m_GFNeg(), llvm::MIPatternMatch::m_GFSub(), llvm::MIPatternMatch::m_Reg(), MI, llvm::MIPatternMatch::mi_match(), MRI, Observer, X, and Y.
bool CombinerHelper::matchRedundantOr | ( | MachineInstr & | MI, |
Register & | Replacement | ||
) |
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.)[in] | MI | - The G_OR instruction. |
[out] | Replacement | - A register the G_OR should be replaced with on success. |
Definition at line 2825 of file CombinerHelper.cpp.
References assert(), llvm::canReplaceReg(), llvm::GISelKnownBits::getKnownBits(), llvm::MachineRegisterInfo::getType(), llvm::LLT::isVector(), KB, LHS, MI, MRI, llvm::KnownBits::One, RHS, and llvm::KnownBits::Zero.
bool CombinerHelper::matchRedundantSExtInReg | ( | MachineInstr & | MI | ) |
MI
is a G_SEXT_INREG that can be erased. Definition at line 2871 of file CombinerHelper.cpp.
References llvm::GISelKnownBits::computeNumSignBits(), llvm::LLT::getScalarSizeInBits(), llvm::MachineRegisterInfo::getType(), KB, MI, and MRI.
bool CombinerHelper::matchRotateOutOfRange | ( | MachineInstr & | MI | ) |
Definition at line 4090 of file CombinerHelper.cpp.
References assert(), llvm::LLT::getScalarSizeInBits(), llvm::MachineRegisterInfo::getType(), llvm::matchUnaryPredicate(), MI, and MRI.
bool CombinerHelper::matchSelectSameVal | ( | MachineInstr & | MI | ) |
Optimize (cond ? x : x) -> x.
Definition at line 2454 of file CombinerHelper.cpp.
References assert(), llvm::canReplaceReg(), matchEqualDefs(), MI, and MRI.
bool CombinerHelper::matchSelectToLogical | ( | MachineInstr & | MI, |
BuildFnTy & | MatchInfo | ||
) |
Fold boolean selects to logical operations.
Definition at line 5552 of file CombinerHelper.cpp.
References Cond, llvm::GSelect::getCondReg(), llvm::getDefIgnoringCopies(), llvm::GSelect::getFalseReg(), llvm::GenericMachineInstr::getReg(), llvm::LLT::getScalarSizeInBits(), llvm::GSelect::getTrueReg(), llvm::MachineRegisterInfo::getType(), llvm::isConstantOrConstantSplatVector(), MI, and MRI.
bool CombinerHelper::matchSextInRegOfLoad | ( | MachineInstr & | MI, |
std::tuple< Register, unsigned > & | MatchInfo | ||
) |
Match sext_inreg(load p), imm -> sextload p.
Definition at line 804 of file CombinerHelper.cpp.
References assert(), llvm::MachineRegisterInfo::getType(), llvm::MachineRegisterInfo::hasOneNonDBGUse(), isLegalOrBeforeLegalizer(), llvm::isPowerOf2_32(), llvm::LLT::isVector(), llvm::LegalityQuery::MemDesc::MemoryTy, MI, llvm::min(), MRI, and llvm::LLT::scalar().
bool CombinerHelper::matchSextTruncSextLoad | ( | MachineInstr & | MI | ) |
Definition at line 771 of file CombinerHelper.cpp.
References assert(), llvm::LLT::getSizeInBits(), llvm::MachineRegisterInfo::getType(), llvm::LLT::isVector(), llvm::MIPatternMatch::m_GTrunc(), llvm::MIPatternMatch::m_Reg(), MI, llvm::MIPatternMatch::mi_match(), and MRI.
bool CombinerHelper::matchShiftImmedChain | ( | MachineInstr & | MI, |
RegisterImmPair & | MatchInfo | ||
) |
Fold (shift (shift base, x), y) -> (shift base (x+y))
Definition at line 1383 of file CombinerHelper.cpp.
References assert(), llvm::sampleprof::Base, llvm::getIConstantVRegValWithLookThrough(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), llvm::LLT::getScalarSizeInBits(), llvm::MachineRegisterInfo::getType(), llvm::MachineRegisterInfo::getUniqueVRegDef(), llvm::RegisterImmPair::Imm, MI, MRI, and llvm::RegisterImmPair::Reg.
bool CombinerHelper::matchShiftOfShiftedLogic | ( | MachineInstr & | MI, |
ShiftOfShiftedLogic & | MatchInfo | ||
) |
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 1461 of file CombinerHelper.cpp.
References assert(), C1, llvm::getIConstantVRegValWithLookThrough(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), llvm::LLT::getScalarSizeInBits(), llvm::MachineRegisterInfo::getType(), llvm::MachineRegisterInfo::getUniqueVRegDef(), llvm::MachineRegisterInfo::hasOneNonDBGUse(), llvm::ShiftOfShiftedLogic::Logic, llvm::ShiftOfShiftedLogic::LogicNonShiftReg, MI, MRI, llvm::ShiftOfShiftedLogic::Shift2, and llvm::ShiftOfShiftedLogic::ValSum.
bool CombinerHelper::matchSimplifyAddToSub | ( | MachineInstr & | MI, |
std::tuple< Register, Register > & | MatchInfo | ||
) |
Return true if MI is a G_ADD which can be simplified to a G_SUB.
Definition at line 2518 of file CombinerHelper.cpp.
References LHS, llvm::MIPatternMatch::m_Neg(), llvm::MIPatternMatch::m_Reg(), MI, llvm::MIPatternMatch::mi_match(), MRI, and RHS.
bool CombinerHelper::matchTruncStoreMerge | ( | MachineInstr & | MI, |
MergeTruncStoresInfo & | MatchInfo | ||
) |
Match a pattern where a wide type scalar value is stored by several narrow stores.
Fold it into a single store or a BSWAP and a store if the targets supports it.
Assuming little endian target: i8 *p = ... i32 val = ... p[0] = (val >> 0) & 0xFF; p[1] = (val >> 8) & 0xFF; p[2] = (val >> 16) & 0xFF; p[3] = (val >> 24) & 0xFF; => *((i32)p) = val;
i8 *p = ... i32 val = ... p[0] = (val >> 24) & 0xFF; p[1] = (val >> 16) & 0xFF; p[2] = (val >> 8) & 0xFF; p[3] = (val >> 0) & 0xFF; => *((i32)p) = BSWAP(val);
Definition at line 3590 of file CombinerHelper.cpp.
References llvm::ARMBuildAttrs::Allowed, llvm::TargetLoweringBase::allowsMemoryAccess(), assert(), DL, llvm::SmallVectorImpl< T >::emplace_back(), llvm::MergeTruncStoresInfo::FoundStores, llvm::MachineMemOperand::getMemoryType(), llvm::GLoadStore::getMMO(), llvm::GLoadStore::getPointerReg(), llvm::LLT::getScalarSizeInBits(), llvm::LLT::getSizeInBits(), getTargetLowering(), getTruncStoreByteOffset(), llvm::MachineRegisterInfo::getType(), i, INT64_MAX, isLegalOrBeforeLegalizer(), llvm::LLT::isScalar(), llvm::GLoadStore::isSimple(), llvm::Register::isValid(), j(), llvm::MergeTruncStoresInfo::LowestIdxStore, llvm::MIPatternMatch::m_GPtrAdd(), llvm::MIPatternMatch::m_ICst(), llvm::MIPatternMatch::m_Reg(), MI, llvm::MIPatternMatch::mi_match(), move, MRI, llvm::MergeTruncStoresInfo::NeedBSwap, llvm::MergeTruncStoresInfo::NeedRotate, and llvm::MergeTruncStoresInfo::WideSrcVal.
bool CombinerHelper::matchUDivByConst | ( | MachineInstr & | MI | ) |
Combine G_UDIV by constant into a multiply by magic constant.
Definition at line 4869 of file CombinerHelper.cpp.
References assert(), llvm::LLT::changeElementSize(), DL, llvm::getApproximateEVTForLLT(), llvm::AttributeList::getAttributes(), getTargetLowering(), llvm::MachineRegisterInfo::getType(), llvm::MachineRegisterInfo::getVRegDef(), llvm::isConstantOrConstantVector(), isLegalOrBeforeLegalizer(), llvm::LLT::isVector(), LI, llvm::matchUnaryPredicate(), MI, MRI, RHS, and llvm::LLT::scalar().
bool CombinerHelper::matchUMulHToLShr | ( | MachineInstr & | MI | ) |
Definition at line 4917 of file CombinerHelper.cpp.
References assert(), llvm::TargetLoweringBase::getPreferredShiftAmountTy(), getTargetLowering(), llvm::MachineRegisterInfo::getType(), isLegalOrBeforeLegalizer(), llvm::matchUnaryPredicate(), MI, MRI, and RHS.
bool CombinerHelper::matchUndefSelectCmp | ( | MachineInstr & | MI | ) |
Return true if a G_SELECT instruction MI
has an undef comparison.
Definition at line 2306 of file CombinerHelper.cpp.
References assert(), llvm::getOpcodeDef(), MI, and MRI.
bool CombinerHelper::matchUndefShuffleVectorMask | ( | MachineInstr & | MI | ) |
Return true if a G_SHUFFLE_VECTOR instruction MI
has an undef mask.
Definition at line 2294 of file CombinerHelper.cpp.
References llvm::all_of(), assert(), llvm::BitmaskEnumDetail::Mask(), and MI.
bool CombinerHelper::matchUndefStore | ( | MachineInstr & | MI | ) |
Return true if a G_STORE instruction MI
is storing an undef value.
Definition at line 2300 of file CombinerHelper.cpp.
References assert(), llvm::getOpcodeDef(), MI, and MRI.
bool CombinerHelper::matchXorOfAndWithSameReg | ( | MachineInstr & | MI, |
std::pair< Register, Register > & | MatchInfo | ||
) |
Fold (xor (and x, y), y) -> (and (not x), y) {.
Definition at line 2995 of file CombinerHelper.cpp.
References assert(), llvm::MachineRegisterInfo::hasOneNonDBGUse(), llvm::MIPatternMatch::m_GAnd(), llvm::MIPatternMatch::m_Reg(), MI, llvm::MIPatternMatch::mi_match(), MRI, std::swap(), X, and Y.
bool CombinerHelper::replaceInstWithConstant | ( | MachineInstr & | MI, |
APInt | C | ||
) |
Replace an instruction with a G_CONSTANT with value C
.
Definition at line 2502 of file CombinerHelper.cpp.
References assert(), llvm::MachineIRBuilder::buildConstant(), Builder, MI, and llvm::MachineIRBuilder::setInstr().
bool CombinerHelper::replaceInstWithConstant | ( | MachineInstr & | MI, |
int64_t | C | ||
) |
Replace an instruction with a G_CONSTANT with value C
.
Definition at line 2494 of file CombinerHelper.cpp.
References assert(), llvm::MachineIRBuilder::buildConstant(), Builder, MI, and llvm::MachineIRBuilder::setInstr().
bool CombinerHelper::replaceInstWithFConstant | ( | MachineInstr & | MI, |
double | C | ||
) |
Replace an instruction with a G_FCONSTANT with value C
.
Definition at line 2486 of file CombinerHelper.cpp.
References assert(), Builder, llvm::MachineIRBuilder::buildFConstant(), MI, and llvm::MachineIRBuilder::setInstr().
bool CombinerHelper::replaceInstWithUndef | ( | MachineInstr & | MI | ) |
Replace an instruction with a G_IMPLICIT_DEF.
Definition at line 2510 of file CombinerHelper.cpp.
References assert(), Builder, llvm::MachineIRBuilder::buildUndef(), MI, and llvm::MachineIRBuilder::setInstr().
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 178 of file CombinerHelper.cpp.
References Builder, llvm::GISelChangeObserver::changedInstr(), llvm::GISelChangeObserver::changingInstr(), llvm::MCInstrInfo::get(), llvm::MachineIRBuilder::getTII(), Observer, and llvm::MachineInstr::setDesc().
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 167 of file CombinerHelper.cpp.
References assert(), llvm::GISelChangeObserver::changedInstr(), llvm::GISelChangeObserver::changingInstr(), llvm::MachineOperand::getParent(), Observer, and llvm::MachineOperand::setReg().
Referenced by applyCombineExtendingLoads().
void CombinerHelper::replaceRegWith | ( | MachineRegisterInfo & | MRI, |
Register | FromReg, | ||
Register | ToReg | ||
) | const |
MachineRegisterInfo::replaceRegWith() and inform the observer of the changes.
Definition at line 155 of file CombinerHelper.cpp.
References llvm::MachineIRBuilder::buildCopy(), Builder, llvm::GISelChangeObserver::changingAllUsesOfReg(), llvm::MachineRegisterInfo::constrainRegAttrs(), llvm::GISelChangeObserver::finishedChangingAllUsesOfReg(), MRI, Observer, and llvm::MachineRegisterInfo::replaceRegWith().
Referenced by applyCombineConcatVectors(), applyCombineCopy(), applyCombineExtendingLoads(), applyCombineShuffleVector(), applyCombineTruncOfExt(), applyCombineUnmergeMergeToPlainValues(), applyCombineUnmergeZExtToZExt(), applyExtractAllEltsFromBuildVector(), applyNotCmp(), matchOverlappingAnd(), replaceSingleDefInstWithOperand(), replaceSingleDefInstWithReg(), and tryToSimplifyUADDO().
bool CombinerHelper::replaceSingleDefInstWithOperand | ( | MachineInstr & | MI, |
unsigned | OpIdx | ||
) |
Delete MI
and replace all of its uses with its OpIdx-th
operand.
Definition at line 2433 of file CombinerHelper.cpp.
References assert(), llvm::canReplaceReg(), MI, MRI, and replaceRegWith().
bool CombinerHelper::replaceSingleDefInstWithReg | ( | MachineInstr & | MI, |
Register | Replacement | ||
) |
Delete MI
and replace all of its uses with Replacement
.
Definition at line 2444 of file CombinerHelper.cpp.
References assert(), llvm::canReplaceReg(), MI, MRI, and replaceRegWith().
Referenced by applyExtractVecEltBuildVec(), and applyUDivByConst().
void CombinerHelper::setRegBank | ( | Register | Reg, |
const RegisterBank * | RegBank | ||
) |
Set the register bank of Reg
.
Does nothing if the RegBank is null. This is the counterpart to getRegBank.
Definition at line 191 of file CombinerHelper.cpp.
References MRI, and llvm::MachineRegisterInfo::setRegBank().
Referenced by applyPtrAddImmedChain().
bool CombinerHelper::tryCombine | ( | MachineInstr & | MI | ) |
Try to transform MI
by using all of the above combine functions.
Returns true if changed.
Definition at line 5636 of file CombinerHelper.cpp.
References MI, tryCombineCopy(), tryCombineExtendingLoads(), and tryCombineIndexedLoadStore().
bool CombinerHelper::tryCombineConcatVectors | ( | MachineInstr & | MI | ) |
If MI
is G_CONCAT_VECTORS, try to combine it.
Returns true if MI changed. Right now, we support:
Definition at line 217 of file CombinerHelper.cpp.
References applyCombineConcatVectors(), matchCombineConcatVectors(), and MI.
bool CombinerHelper::tryCombineCopy | ( | MachineInstr & | MI | ) |
If MI
is COPY, try to combine it.
Returns true if MI changed.
Definition at line 196 of file CombinerHelper.cpp.
References applyCombineCopy(), matchCombineCopy(), and MI.
Referenced by tryCombine().
bool CombinerHelper::tryCombineExtendingLoads | ( | MachineInstr & | MI | ) |
If MI
is extend that consumes the result of a load, try to combine it.
Returns true if MI changed.
Definition at line 479 of file CombinerHelper.cpp.
References applyCombineExtendingLoads(), matchCombineExtendingLoads(), and MI.
Referenced by tryCombine().
bool CombinerHelper::tryCombineIndexedLoadStore | ( | MachineInstr & | MI | ) |
Combine MI
into a pre-indexed or post-indexed load/store operation if legal and the surrounding code makes it useful.
Definition at line 998 of file CombinerHelper.cpp.
References applyCombineIndexedLoadStore(), matchCombineIndexedLoadStore(), and MI.
Referenced by tryCombine().
bool CombinerHelper::tryCombineMemCpyFamily | ( | MachineInstr & | MI, |
unsigned | MaxLen = 0 |
||
) |
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 1238 of file CombinerHelper.cpp.
References llvm::MachineIRBuilder::getMF(), llvm::LegalizerHelper::lowerMemCpyFamily(), and MI.
bool CombinerHelper::tryCombineShiftToUnmerge | ( | MachineInstr & | MI, |
unsigned | TargetShiftAmount | ||
) |
Definition at line 1971 of file CombinerHelper.cpp.
References applyCombineShiftToUnmerge(), matchCombineShiftToUnmerge(), and MI.
bool CombinerHelper::tryCombineShuffleVector | ( | MachineInstr & | MI | ) |
Try to combine G_SHUFFLE_VECTOR into G_CONCAT_VECTORS.
Returns true if MI changed.
Definition at line 294 of file CombinerHelper.cpp.
References applyCombineShuffleVector(), matchCombineShuffleVector(), and MI.
bool CombinerHelper::tryEmitMemcpyInline | ( | MachineInstr & | MI | ) |
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 1230 of file CombinerHelper.cpp.
References llvm::MachineIRBuilder::getMF(), and MI.
|
protected |
Definition at line 110 of file CombinerHelper.h.
Referenced by applyAshShlToSextInreg(), applyBuildFn(), applyBuildFnNoErase(), applyBuildInstructionSteps(), applyCombineAddP2IToPtrAdd(), applyCombineConcatVectors(), applyCombineConstantFoldFpUnary(), applyCombineConstPtrAddToI2P(), applyCombineDivRem(), applyCombineExtendingLoads(), applyCombineExtOfExt(), applyCombineI2PToP2I(), applyCombineInsertVecElts(), applyCombineMulByNegativeOne(), applyCombineP2IToI2P(), applyCombineShiftToUnmerge(), applyCombineShlOfExtend(), applyCombineShuffleVector(), applyCombineTruncOfExt(), applyCombineTruncOfShl(), applyCombineUnmergeConstant(), applyCombineUnmergeMergeToPlainValues(), applyCombineUnmergeWithDeadLanesToTrunc(), applyCombineUnmergeZExtToZExt(), applyExtendThroughPhis(), applyExtractVecEltBuildVec(), applyFoldBinOpIntoSelect(), applyFunnelShiftToRotate(), applyNotCmp(), applyOptBrCondByInvertingCond(), applyPtrAddZero(), applyRotateOutOfRange(), applySextInRegOfLoad(), applySextTruncSextLoad(), applyShiftImmedChain(), applyShiftOfShiftedLogic(), applySimplifyAddToSub(), applySimplifyURemByPow2(), applyTruncStoreMerge(), applyUMulHToLShr(), applyXorOfAndWithSameReg(), buildUDivUsingMul(), getTargetLowering(), matchCombineConcatVectors(), matchCombineConstPtrAddToI2P(), matchCombineShuffleVector(), matchEqualDefs(), matchExtendThroughPhis(), matchMulOBy2(), matchNarrowBinopFeedingAnd(), matchNotCmp(), matchPtrAddZero(), matchReassocConstantInnerRHS(), replaceInstWithConstant(), replaceInstWithFConstant(), replaceInstWithUndef(), replaceOpcodeWith(), and replaceRegWith().
|
protected |
Definition at line 113 of file CombinerHelper.h.
Referenced by getKnownBits(), matchCombineShlOfExtend(), matchCombineTruncOfShl(), matchCombineZextTrunc(), matchICmpToLHSKnownBits(), matchICmpToTrueFalseKnownBits(), matchOperandIsKnownToBeAPowerOfTwo(), matchRedundantAnd(), matchRedundantOr(), and matchRedundantSExtInReg().
|
protected |
Definition at line 115 of file CombinerHelper.h.
Referenced by canCombineFMadOrFMA(), isLegal(), isPreLegalize(), matchBitfieldExtractFromSExtInReg(), matchBitfieldExtractFromShr(), matchCombineExtendingLoads(), matchCombineShlOfExtend(), and matchUDivByConst().
|
protected |
Definition at line 114 of file CombinerHelper.h.
Referenced by dominates().
|
protected |
Definition at line 111 of file CombinerHelper.h.
Referenced by applyAshShlToSextInreg(), applyCombineAddP2IToPtrAdd(), applyCombineConcatVectors(), applyCombineCopy(), applyCombineExtendingLoads(), applyCombineIndexedLoadStore(), applyCombineInsertVecElts(), applyCombineMulByNegativeOne(), applyCombineMulToShl(), applyCombineShiftToUnmerge(), applyCombineShlOfExtend(), applyCombineShuffleVector(), applyCombineTruncOfExt(), applyCombineTruncOfShl(), applyCombineUnmergeMergeToPlainValues(), applyCombineUnmergeWithDeadLanesToTrunc(), applyCombineUnmergeZExtToZExt(), applyExtendThroughPhis(), applyExtractAllEltsFromBuildVector(), applyExtractVecEltBuildVec(), applyFoldBinOpIntoSelect(), applyNotCmp(), applyOptBrCondByInvertingCond(), applyPtrAddImmedChain(), applyRotateOutOfRange(), applySextInRegOfLoad(), applyShiftImmedChain(), applyShiftOfShiftedLogic(), applySimplifyURemByPow2(), applyTruncStoreMerge(), applyUMulHToLShr(), applyXorOfAndWithSameReg(), buildUDivUsingMul(), canCombineFMadOrFMA(), getRegBank(), matchAddOBy0(), matchAndOrDisjointMask(), matchAshrShlToSextInreg(), matchBinOpSameVal(), matchBitfieldExtractFromAnd(), matchBitfieldExtractFromSExtInReg(), matchBitfieldExtractFromShr(), matchBitfieldExtractFromShrAnd(), matchCombineAddP2IToPtrAdd(), matchCombineAnyExtTrunc(), matchCombineConcatVectors(), matchCombineConstantFoldFpUnary(), matchCombineConstPtrAddToI2P(), matchCombineCopy(), matchCombineDivRem(), matchCombineExtendingLoads(), matchCombineExtOfExt(), matchCombineFAbsOfFAbs(), matchCombineFAbsOfFNeg(), matchCombineFAddFMAFMulToFMadOrFMA(), matchCombineFAddFMulToFMadOrFMA(), matchCombineFAddFpExtFMulToFMadOrFMA(), matchCombineFAddFpExtFMulToFMadOrFMAAggressive(), matchCombineFMinMaxNaN(), matchCombineFNegOfFNeg(), matchCombineFSubFMulToFMadOrFMA(), matchCombineFSubFNegFMulToFMadOrFMA(), matchCombineFSubFpExtFMulToFMadOrFMA(), matchCombineFSubFpExtFNegFMulToFMadOrFMA(), matchCombineI2PToP2I(), matchCombineInsertVecElts(), matchCombineLoadWithAndMask(), matchCombineMergeUnmerge(), matchCombineMulToShl(), matchCombineP2IToI2P(), matchCombineShiftToUnmerge(), matchCombineShlOfExtend(), matchCombineShuffleVector(), matchCombineTruncOfExt(), matchCombineTruncOfShl(), matchCombineUnmergeConstant(), matchCombineUnmergeMergeToPlainValues(), matchCombineUnmergeUndef(), matchCombineUnmergeWithDeadLanesToTrunc(), matchCombineUnmergeZExtToZExt(), matchCombineZextTrunc(), matchConstantFold(), matchConstantOp(), matchConstantSelectCmp(), matchEqualDefs(), matchExtendThroughPhis(), matchExtractAllEltsFromBuildVector(), matchExtractVecEltBuildVec(), matchFoldBinOpIntoSelect(), matchFunnelShiftToRotate(), matchHoistLogicOpWithSameOpcodeHands(), matchICmpToLHSKnownBits(), matchICmpToTrueFalseKnownBits(), matchLoadOrCombine(), matchMulOBy0(), matchMulOBy2(), matchNarrowBinopFeedingAnd(), matchNotCmp(), matchOperandIsKnownToBeAPowerOfTwo(), matchOperandIsUndef(), matchOperandIsZero(), matchOrShiftToFunnelShift(), matchOverlappingAnd(), matchPtrAddImmedChain(), matchPtrAddZero(), matchReassocConstantInnerLHS(), matchReassocConstantInnerRHS(), matchReassocFoldConstantsInSubTree(), matchReassocPtrAdd(), matchRedundantAnd(), matchRedundantNegOperands(), matchRedundantOr(), matchRedundantSExtInReg(), matchRotateOutOfRange(), matchSelectSameVal(), matchSelectToLogical(), matchSextInRegOfLoad(), matchSextTruncSextLoad(), matchShiftImmedChain(), matchShiftOfShiftedLogic(), matchSimplifyAddToSub(), matchTruncStoreMerge(), matchUDivByConst(), matchUMulHToLShr(), matchUndefSelectCmp(), matchUndefStore(), matchXorOfAndWithSameReg(), replaceRegWith(), replaceSingleDefInstWithOperand(), replaceSingleDefInstWithReg(), and setRegBank().
|
protected |
Definition at line 112 of file CombinerHelper.h.
Referenced by applyCombineExtendingLoads(), applyCombineExtOfExt(), applyCombineMulToShl(), applyFoldBinOpIntoSelect(), applyFunnelShiftToRotate(), applyNotCmp(), applyOptBrCondByInvertingCond(), applyPtrAddImmedChain(), applyRotateOutOfRange(), applyShiftImmedChain(), applyXorOfAndWithSameReg(), matchAndOrDisjointMask(), matchCombineFAbsOfFNeg(), matchMulOBy2(), matchNarrowBinopFeedingAnd(), matchReassocConstantInnerLHS(), matchReassocConstantInnerRHS(), matchReassocFoldConstantsInSubTree(), matchRedundantNegOperands(), replaceOpcodeWith(), replaceRegOpWith(), and replaceRegWith().
|
protected |
Definition at line 116 of file CombinerHelper.h.
Referenced by getRegBank().
|
protected |
Definition at line 117 of file CombinerHelper.h.
Referenced by getRegBank().