LLVM 23.0.0git
llvm::SPIRVCombinerHelper Class Reference

#include "Target/SPIRV/SPIRVCombinerHelper.h"

Inheritance diagram for llvm::SPIRVCombinerHelper:
[legend]

Public Member Functions

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

Protected Attributes

const SPIRVSubtargetSTI
Protected Attributes inherited from llvm::CombinerHelper
MachineIRBuilderBuilder
MachineRegisterInfoMRI
GISelChangeObserverObserver
GISelValueTrackingVT
MachineDominatorTreeMDT
bool IsPreLegalize
const LegalizerInfoLI
const TargetInstrInfoTII
const RegisterBankInfoRBI
const TargetRegisterInfoTRI

Detailed Description

Definition at line 21 of file SPIRVCombinerHelper.h.

Constructor & Destructor Documentation

◆ SPIRVCombinerHelper()

Member Function Documentation

◆ applyMatrixMultiply()

void SPIRVCombinerHelper::applyMatrixMultiply ( MachineInstr & MI) const

◆ applyMatrixTranspose()

void SPIRVCombinerHelper::applyMatrixTranspose ( MachineInstr & MI) const

Definition at line 222 of file SPIRVCombinerHelper.cpp.

References llvm::CombinerHelper::Builder, llvm::CallingConv::C, and MI.

◆ applySPIRVDistance()

void SPIRVCombinerHelper::applySPIRVDistance ( MachineInstr & MI) const

◆ applySPIRVFaceForward()

◆ CombinerHelper()

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

Definition at line 129 of file CombinerHelper.cpp.

Referenced by SPIRVCombinerHelper().

◆ matchLengthToDistance()

bool SPIRVCombinerHelper::matchLengthToDistance ( MachineInstr & MI) const

This match is part of a combine that rewrites length(X - Y) to distance(X, Y) (f32 (g_intrinsic length (g_fsub (vXf32 X) (vXf32 Y)))) -> (f32 (g_intrinsic distance (vXf32 X) (vXf32 Y)))

Definition at line 36 of file SPIRVCombinerHelper.cpp.

References llvm::cast(), llvm::MachineInstr::getOpcode(), MI, and llvm::CombinerHelper::MRI.

◆ matchMatrixMultiply()

bool SPIRVCombinerHelper::matchMatrixMultiply ( MachineInstr & MI) const

Definition at line 247 of file SPIRVCombinerHelper.cpp.

References llvm::cast(), and MI.

◆ matchMatrixTranspose()

bool SPIRVCombinerHelper::matchMatrixTranspose ( MachineInstr & MI) const

Definition at line 217 of file SPIRVCombinerHelper.cpp.

References llvm::cast(), and MI.

◆ matchSelectToFaceForward()

bool SPIRVCombinerHelper::matchSelectToFaceForward ( MachineInstr & MI) const

Member Data Documentation

◆ STI

const SPIRVSubtarget& llvm::SPIRVCombinerHelper::STI
protected

Definition at line 23 of file SPIRVCombinerHelper.h.

Referenced by matchSelectToFaceForward(), and SPIRVCombinerHelper().


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