LLVM  13.0.0git
Public Member Functions | Protected Attributes | List of all members
llvm::CombinerHelper Class Reference

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

Collaboration diagram for llvm::CombinerHelper:
Collaboration graph
[legend]

Public Member Functions

 CombinerHelper (GISelChangeObserver &Observer, MachineIRBuilder &B, GISelKnownBits *KB=nullptr, MachineDominatorTree *MDT=nullptr, const LegalizerInfo *LI=nullptr)
 
GISelKnownBitsgetKnownBits () const
 
const TargetLoweringgetTargetLowering () const
 
bool isLegalOrBeforeLegalizer (const LegalityQuery &Query) 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...
 
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 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)
 
bool applySextTruncSextLoad (MachineInstr &MI)
 
bool matchSextInRegOfLoad (MachineInstr &MI, std::tuple< Register, unsigned > &MatchInfo)
 Match sext_inreg(load p), imm -> sextload p. More...
 
bool 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)
 
bool applyPtrAddImmedChain (MachineInstr &MI, PtrAddChain &MatchInfo)
 
bool matchShiftImmedChain (MachineInstr &MI, RegisterImmPair &MatchInfo)
 Fold (shift (shift base, x), y) -> (shift base (x+y)) More...
 
bool 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...
 
bool 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...
 
bool applyCombineMulToShl (MachineInstr &MI, unsigned &ShiftVal)
 
bool matchCombineShlOfExtend (MachineInstr &MI, RegisterImmPair &MatchData)
 
bool applyCombineShlOfExtend (MachineInstr &MI, const RegisterImmPair &MatchData)
 
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...
 
bool 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...
 
bool applyCombineUnmergeMergeToPlainValues (MachineInstr &MI, SmallVectorImpl< Register > &Operands)
 
bool matchCombineUnmergeConstant (MachineInstr &MI, SmallVectorImpl< APInt > &Csts)
 Transform G_UNMERGE Constant -> Constant1, Constant2, ... More...
 
bool applyCombineUnmergeConstant (MachineInstr &MI, SmallVectorImpl< APInt > &Csts)
 
bool matchCombineUnmergeWithDeadLanesToTrunc (MachineInstr &MI)
 Transform X, Y<dead> = G_UNMERGE Z -> X = G_TRUNC Z. More...
 
bool applyCombineUnmergeWithDeadLanesToTrunc (MachineInstr &MI)
 
bool matchCombineUnmergeZExtToZExt (MachineInstr &MI)
 Transform X, Y = G_UNMERGE(G_ZEXT(Z)) -> X = G_ZEXT(Z); Y = G_CONSTANT 0. More...
 
bool applyCombineUnmergeZExtToZExt (MachineInstr &MI)
 
bool matchCombineConstantFoldFpUnary (MachineInstr &MI, Optional< APFloat > &Cst)
 Transform fp_instr(cst) to constant result of the fp operation. More...
 
bool 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...
 
bool applyCombineI2PToP2I (MachineInstr &MI, Register &Reg)
 
bool matchCombineP2IToI2P (MachineInstr &MI, Register &Reg)
 Transform PtrToInt(IntToPtr(x)) to x. More...
 
bool 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...
 
bool applyCombineAddP2IToPtrAdd (MachineInstr &MI, std::pair< Register, bool > &PtrRegAndCommute)
 
bool matchCombineConstPtrAddToI2P (MachineInstr &MI, int64_t &NewCst)
 
bool applyCombineConstPtrAddToI2P (MachineInstr &MI, int64_t &NewCst)
 
bool matchCombineAnyExtTrunc (MachineInstr &MI, Register &Reg)
 Transform anyext(trunc(x)) to x. More...
 
bool 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...
 
bool 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...
 
bool applyCombineFAbsOfFAbs (MachineInstr &MI, Register &Src)
 
bool matchCombineTruncOfExt (MachineInstr &MI, std::pair< Register, unsigned > &MatchInfo)
 Transform trunc ([asz]ext x) to x or ([asz]ext x) or (trunc x). More...
 
bool 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...
 
bool applyCombineTruncOfShl (MachineInstr &MI, std::pair< Register, Register > &MatchInfo)
 
bool 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 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...
 
bool 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...
 
bool 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...
 
bool applyAshShlToSextInreg (MachineInstr &MI, std::tuple< Register, int64_t > &MatchInfo)
 
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...
 
bool 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...
 
bool applyXorOfAndWithSameReg (MachineInstr &MI, std::pair< Register, Register > &MatchInfo)
 
bool matchPtrAddZero (MachineInstr &MI)
 } More...
 
bool applyPtrAddZero (MachineInstr &MI)
 
bool applySimplifyURemByPow2 (MachineInstr &MI)
 Combine G_UREM x, (known power of 2) to an add and bitmasking. More...
 
bool matchCombineInsertVecElts (MachineInstr &MI, SmallVectorImpl< Register > &MatchInfo)
 
bool applyCombineInsertVecElts (MachineInstr &MI, SmallVectorImpl< Register > &MatchInfo)
 
bool matchLoadOrCombine (MachineInstr &MI, std::function< void(MachineIRBuilder &)> &MatchInfo)
 Match expression trees of the form. More...
 
bool matchExtendThroughPhis (MachineInstr &MI, MachineInstr *&ExtMI)
 
bool 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)
 
bool applyBuildFn (MachineInstr &MI, std::function< void(MachineIRBuilder &)> &MatchInfo)
 Use a function which takes in a MachineIRBuilder to perform a combine. More...
 
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 tryCombine (MachineInstr &MI)
 Try to transform MI by using all of the above combine functions. More...
 

Protected Attributes

MachineIRBuilderBuilder
 
MachineRegisterInfoMRI
 
GISelChangeObserverObserver
 
GISelKnownBitsKB
 
MachineDominatorTreeMDT
 
const LegalizerInfoLI
 

Detailed Description

Definition at line 89 of file CombinerHelper.h.

Constructor & Destructor Documentation

◆ CombinerHelper()

CombinerHelper::CombinerHelper ( GISelChangeObserver Observer,
MachineIRBuilder B,
GISelKnownBits KB = nullptr,
MachineDominatorTree MDT = nullptr,
const LegalizerInfo LI = nullptr 
)

Definition at line 43 of file CombinerHelper.cpp.

Member Function Documentation

◆ applyAshShlToSextInreg()

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

◆ applyBuildFn()

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

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

Definition at line 3863 of file CombinerHelper.cpp.

References Builder, MI, and llvm::MachineIRBuilder::setInstrAndDebugLoc().

◆ applyBuildInstructionSteps()

bool CombinerHelper::applyBuildInstructionSteps ( MachineInstr MI,
InstructionStepsMatchInfo MatchInfo 
)

Replace MI with a series of instructions described in MatchInfo.

Definition at line 2944 of file CombinerHelper.cpp.

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

◆ applyCombineAddP2IToPtrAdd()

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

◆ applyCombineAnyExtTrunc()

bool llvm::CombinerHelper::applyCombineAnyExtTrunc ( MachineInstr MI,
Register Reg 
)

◆ applyCombineConcatVectors()

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 220 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().

◆ applyCombineConstantFoldFpUnary()

bool CombinerHelper::applyCombineConstantFoldFpUnary ( MachineInstr MI,
Optional< APFloat > &  Cst 
)

◆ applyCombineConstPtrAddToI2P()

bool CombinerHelper::applyCombineConstPtrAddToI2P ( MachineInstr MI,
int64_t &  NewCst 
)

◆ applyCombineCopy()

void CombinerHelper::applyCombineCopy ( MachineInstr MI)

Definition at line 158 of file CombinerHelper.cpp.

References MI, MRI, and replaceRegWith().

Referenced by tryCombineCopy().

◆ applyCombineDivRem()

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

◆ applyCombineExtendingLoads()

void CombinerHelper::applyCombineExtendingLoads ( MachineInstr MI,
PreferredTuple MatchInfo 
)

◆ applyCombineExtOfExt()

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

◆ applyCombineFAbsOfFAbs()

bool llvm::CombinerHelper::applyCombineFAbsOfFAbs ( MachineInstr MI,
Register Src 
)

◆ applyCombineI2PToP2I()

bool CombinerHelper::applyCombineI2PToP2I ( MachineInstr MI,
Register Reg 
)

◆ applyCombineIndexedLoadStore()

void CombinerHelper::applyCombineIndexedLoadStore ( MachineInstr MI,
IndexedLoadStoreMatchInfo MatchInfo 
)

◆ applyCombineInsertVecElts()

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

◆ applyCombineMulByNegativeOne()

bool CombinerHelper::applyCombineMulByNegativeOne ( MachineInstr MI)

◆ applyCombineMulToShl()

bool CombinerHelper::applyCombineMulToShl ( MachineInstr MI,
unsigned &  ShiftVal 
)

◆ applyCombineP2IToI2P()

bool CombinerHelper::applyCombineP2IToI2P ( MachineInstr MI,
Register Reg 
)

◆ applyCombineShiftToUnmerge()

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

◆ applyCombineShlOfExtend()

bool CombinerHelper::applyCombineShlOfExtend ( MachineInstr MI,
const RegisterImmPair MatchData 
)

◆ applyCombineShuffleVector()

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

◆ applyCombineTruncOfExt()

bool CombinerHelper::applyCombineTruncOfExt ( MachineInstr MI,
std::pair< Register, unsigned > &  MatchInfo 
)

◆ applyCombineTruncOfShl()

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

◆ applyCombineUnmergeConstant()

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

◆ applyCombineUnmergeMergeToPlainValues()

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

◆ applyCombineUnmergeWithDeadLanesToTrunc()

bool CombinerHelper::applyCombineUnmergeWithDeadLanesToTrunc ( MachineInstr MI)

◆ applyCombineUnmergeZExtToZExt()

bool CombinerHelper::applyCombineUnmergeZExtToZExt ( MachineInstr MI)

◆ applyExtendThroughPhis()

bool CombinerHelper::applyExtendThroughPhis ( MachineInstr MI,
MachineInstr *&  ExtMI 
)

◆ applyExtractAllEltsFromBuildVector()

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

Definition at line 3851 of file CombinerHelper.cpp.

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

◆ applyExtractVecEltBuildVec()

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

◆ applyFunnelShiftToRotate()

void CombinerHelper::applyFunnelShiftToRotate ( MachineInstr MI)

◆ applyNotCmp()

bool CombinerHelper::applyNotCmp ( MachineInstr MI,
SmallVectorImpl< Register > &  RegsToNegate 
)

◆ applyOptBrCondByInvertingCond()

void CombinerHelper::applyOptBrCondByInvertingCond ( MachineInstr MI,
MachineInstr *&  BrCond 
)

◆ applyPtrAddImmedChain()

bool CombinerHelper::applyPtrAddImmedChain ( MachineInstr MI,
PtrAddChain MatchInfo 
)

◆ applyPtrAddZero()

bool CombinerHelper::applyPtrAddZero ( MachineInstr MI)

◆ applyRotateOutOfRange()

void CombinerHelper::applyRotateOutOfRange ( MachineInstr MI)

◆ applySextInRegOfLoad()

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

◆ applySextTruncSextLoad()

bool CombinerHelper::applySextTruncSextLoad ( MachineInstr MI)

◆ applyShiftImmedChain()

bool CombinerHelper::applyShiftImmedChain ( MachineInstr MI,
RegisterImmPair MatchInfo 
)

◆ applyShiftOfShiftedLogic()

bool CombinerHelper::applyShiftOfShiftedLogic ( MachineInstr MI,
ShiftOfShiftedLogic MatchInfo 
)

◆ applySimplifyAddToSub()

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

◆ applySimplifyURemByPow2()

bool 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 3289 of file CombinerHelper.cpp.

References llvm::MachineIRBuilder::buildAdd(), llvm::MachineIRBuilder::buildAnd(), llvm::MachineIRBuilder::buildConstant(), Builder, llvm::MachineRegisterInfo::getType(), MI, MRI, and llvm::MachineIRBuilder::setInstrAndDebugLoc().

◆ applyXorOfAndWithSameReg()

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

◆ dominates()

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

References assert(), DefMI, llvm::MachineDominatorTree::dominates(), isPredecessor(), MDT, and UseMI.

◆ eraseInst()

bool CombinerHelper::eraseInst ( MachineInstr MI)

Erase MI.

Definition at line 2600 of file CombinerHelper.cpp.

References MI.

◆ getKnownBits()

GISelKnownBits* llvm::CombinerHelper::getKnownBits ( ) const
inline

Definition at line 104 of file CombinerHelper.h.

References KB.

◆ getTargetLowering()

const TargetLowering & CombinerHelper::getTargetLowering ( ) const

◆ isLegalOrBeforeLegalizer()

bool CombinerHelper::isLegalOrBeforeLegalizer ( const LegalityQuery Query) const

◆ isPredecessor()

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

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

Referenced by dominates().

◆ matchAllExplicitUsesAreUndef()

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

References llvm::all_of(), and MI.

◆ matchAnyExplicitUseIsUndef()

bool CombinerHelper::matchAnyExplicitUseIsUndef ( MachineInstr MI)

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

Definition at line 2558 of file CombinerHelper.cpp.

References llvm::any_of(), and MI.

◆ matchAshrShlToSextInreg()

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

◆ matchBinOpSameVal()

bool CombinerHelper::matchBinOpSameVal ( MachineInstr MI)

Optimize (x op x) -> x.

Definition at line 2714 of file CombinerHelper.cpp.

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

◆ matchCombineAddP2IToPtrAdd()

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

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

◆ matchCombineAnyExtTrunc()

bool CombinerHelper::matchCombineAnyExtTrunc ( MachineInstr MI,
Register Reg 
)

◆ matchCombineConcatVectors()

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.

Precondition
MI.getOpcode() == G_CONCAT_VECTORS.

Definition at line 175 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, Reg, llvm::MachineIRBuilder::setInsertPt(), and llvm::RegState::Undef.

Referenced by tryCombineConcatVectors().

◆ matchCombineConstantFoldFpUnary()

bool CombinerHelper::matchCombineConstantFoldFpUnary ( MachineInstr MI,
Optional< APFloat > &  Cst 
)

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

Definition at line 1625 of file CombinerHelper.cpp.

References constantFoldFpUnary(), llvm::MachineRegisterInfo::getType(), llvm::Optional< T >::hasValue(), MI, and MRI.

◆ matchCombineConstPtrAddToI2P()

bool CombinerHelper::matchCombineConstPtrAddToI2P ( MachineInstr MI,
int64_t &  NewCst 
)

◆ matchCombineCopy()

bool CombinerHelper::matchCombineCopy ( MachineInstr MI)

Definition at line 151 of file CombinerHelper.cpp.

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

Referenced by tryCombineCopy().

◆ matchCombineDivRem()

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

References llvm::MachineRegisterInfo::getType(), isLegalOrBeforeLegalizer(), llvm_unreachable, matchEqualDefs(), MI, MRI, llvm::MachineRegisterInfo::use_nodbg_instructions(), and UseMI.

◆ matchCombineExtendingLoads()

bool CombinerHelper::matchCombineExtendingLoads ( MachineInstr MI,
PreferredTuple MatchInfo 
)

◆ matchCombineExtOfExt()

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

◆ matchCombineFAbsOfFAbs()

bool CombinerHelper::matchCombineFAbsOfFAbs ( MachineInstr MI,
Register Src 
)

Match fabs(fabs(x)) to fabs(x).

Definition at line 2474 of file CombinerHelper.cpp.

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

◆ matchCombineFNegOfFNeg()

bool CombinerHelper::matchCombineFNegOfFNeg ( MachineInstr MI,
Register Reg 
)

Transform fneg(fneg(x)) to x.

Definition at line 2468 of file CombinerHelper.cpp.

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

◆ matchCombineI2PToP2I()

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

◆ matchCombineIndexedLoadStore()

bool CombinerHelper::matchCombineIndexedLoadStore ( MachineInstr MI,
IndexedLoadStoreMatchInfo MatchInfo 
)

◆ matchCombineInsertVecElts()

bool CombinerHelper::matchCombineInsertVecElts ( MachineInstr MI,
SmallVectorImpl< Register > &  MatchInfo 
)

◆ matchCombineMulToShl()

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

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

Definition at line 1887 of file CombinerHelper.cpp.

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

◆ matchCombineP2IToI2P()

bool CombinerHelper::matchCombineP2IToI2P ( MachineInstr MI,
Register Reg 
)

Transform PtrToInt(IntToPtr(x)) to x.

Definition at line 2288 of file CombinerHelper.cpp.

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

◆ matchCombineShiftToUnmerge()

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

References assert(), llvm::getConstantVRegValWithLookThrough(), llvm::LLT::getSizeInBits(), llvm::MachineRegisterInfo::getType(), llvm::LLT::isVector(), MI, MRI, and llvm::Check::Size.

Referenced by tryCombineShiftToUnmerge().

◆ matchCombineShlOfExtend()

bool CombinerHelper::matchCombineShlOfExtend ( MachineInstr MI,
RegisterImmPair MatchData 
)

◆ matchCombineShuffleVector()

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.

Precondition
MI.getOpcode() == G_SHUFFLE_VECTOR.

Definition at line 251 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().

◆ matchCombineTruncOfExt()

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

References assert(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), llvm::MachineRegisterInfo::getVRegDef(), MI, and MRI.

◆ matchCombineTruncOfShl()

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

◆ matchCombineUnmergeConstant()

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

◆ matchCombineUnmergeMergeToPlainValues()

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

◆ matchCombineUnmergeWithDeadLanesToTrunc()

bool CombinerHelper::matchCombineUnmergeWithDeadLanesToTrunc ( MachineInstr MI)

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

Definition at line 2066 of file CombinerHelper.cpp.

References assert(), MI, MRI, and llvm::MachineRegisterInfo::use_nodbg_empty().

◆ matchCombineUnmergeZExtToZExt()

bool CombinerHelper::matchCombineUnmergeZExtToZExt ( MachineInstr MI)

◆ matchCombineZextTrunc()

bool CombinerHelper::matchCombineZextTrunc ( MachineInstr MI,
Register Reg 
)

◆ matchConstantOp()

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

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

Referenced by matchOperandIsZero().

◆ matchConstantSelectCmp()

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

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

◆ matchEqualDefs()

bool CombinerHelper::matchEqualDefs ( const MachineOperand MOP1,
const MachineOperand MOP2 
)

◆ matchExtendThroughPhis()

bool CombinerHelper::matchExtendThroughPhis ( MachineInstr MI,
MachineInstr *&  ExtMI 
)

◆ matchExtractAllEltsFromBuildVector()

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

◆ matchExtractVecEltBuildVec()

bool CombinerHelper::matchExtractVecEltBuildVec ( MachineInstr MI,
Register Reg 
)

◆ matchFunnelShiftToRotate()

bool CombinerHelper::matchFunnelShiftToRotate ( MachineInstr MI)

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

Definition at line 3872 of file CombinerHelper.cpp.

References assert(), llvm::MachineRegisterInfo::getType(), isLegalOrBeforeLegalizer(), MI, MRI, X, and Y.

◆ matchHoistLogicOpWithSameOpcodeHands()

bool CombinerHelper::matchHoistLogicOpWithSameOpcodeHands ( MachineInstr MI,
InstructionStepsMatchInfo MatchInfo 
)

◆ matchLoadOrCombine()

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

Match expression trees of the form.

sN *a = ...
sM val = a[0] | (a[1] << N) | (a[2] << 2N) | (a[3] << 3N) ...

And check if the tree can be replaced with a M-bit load + possibly a bswap.

Definition at line 3537 of file CombinerHelper.cpp.

References llvm::LegalityQuery::MemDesc::AlignInBits, 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::MachineMemOperand::getAlign(), llvm::Function::getContext(), llvm::MachineFunction::getDataLayout(), llvm::MachineFunction::getFunction(), llvm::MachineFunction::getMachineMemOperand(), llvm::MachineInstr::getOperand(), llvm::MachineMemOperand::getOrdering(), llvm::MachineMemOperand::getPointerInfo(), llvm::MachineOperand::getReg(), llvm::LLT::getSizeInBits(), getTargetLowering(), llvm::MachineRegisterInfo::getType(), llvm::Optional< T >::hasValue(), isBigEndian(), llvm::DataLayout::isBigEndian(), isLegalOrBeforeLegalizer(), llvm::LLT::isVector(), littleEndianByteAt(), llvm::MachineInstr::memoperands_begin(), MI, MRI, llvm::LegalityQuery::MemDesc::Ordering, llvm::LegalityQuery::MemDesc::SizeInBits, and llvm::Align::value().

◆ matchNotCmp()

bool CombinerHelper::matchNotCmp ( MachineInstr MI,
SmallVectorImpl< Register > &  RegsToNegate 
)

◆ matchOperandIsKnownToBeAPowerOfTwo()

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

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

Definition at line 2732 of file CombinerHelper.cpp.

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

◆ matchOperandIsUndef()

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

Check if operand OpIdx is undef.

Definition at line 2726 of file CombinerHelper.cpp.

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

◆ matchOperandIsZero()

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

Check if operand OpIdx is zero.

Definition at line 2720 of file CombinerHelper.cpp.

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

◆ matchOptBrCondByInvertingCond()

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 1036 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.

◆ matchPtrAddImmedChain()

bool CombinerHelper::matchPtrAddImmedChain ( MachineInstr MI,
PtrAddChain MatchInfo 
)

◆ matchPtrAddZero()

bool CombinerHelper::matchPtrAddZero ( MachineInstr MI)

◆ matchRedundantAnd()

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

Definition at line 2990 of file CombinerHelper.cpp.

References assert(), llvm::canReplaceReg(), llvm::GISelKnownBits::getKnownBits(), llvm::MachineRegisterInfo::getType(), llvm::LLT::isVector(), KB, MI, MRI, llvm::KnownBits::One, and llvm::KnownBits::Zero.

◆ matchRedundantOr()

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

Definition at line 3045 of file CombinerHelper.cpp.

References assert(), llvm::canReplaceReg(), llvm::GISelKnownBits::getKnownBits(), llvm::MachineRegisterInfo::getType(), llvm::LLT::isVector(), KB, MI, MRI, llvm::KnownBits::One, and llvm::KnownBits::Zero.

◆ matchRedundantSExtInReg()

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

Definition at line 3091 of file CombinerHelper.cpp.

References llvm::GISelKnownBits::computeNumSignBits(), llvm::LLT::getScalarSizeInBits(), llvm::MachineRegisterInfo::getType(), KB, MI, and MRI.

◆ matchRotateOutOfRange()

bool CombinerHelper::matchRotateOutOfRange ( MachineInstr MI)

◆ matchSelectSameVal()

bool CombinerHelper::matchSelectSameVal ( MachineInstr MI)

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

Definition at line 2706 of file CombinerHelper.cpp.

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

◆ matchSextInRegOfLoad()

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

◆ matchSextTruncSextLoad()

bool CombinerHelper::matchSextTruncSextLoad ( MachineInstr MI)

◆ matchShiftImmedChain()

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

◆ matchShiftOfShiftedLogic()

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

◆ matchSimplifyAddToSub()

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

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

◆ matchUndefSelectCmp()

bool CombinerHelper::matchUndefSelectCmp ( MachineInstr MI)

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

Definition at line 2584 of file CombinerHelper.cpp.

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

◆ matchUndefShuffleVectorMask()

bool CombinerHelper::matchUndefShuffleVectorMask ( MachineInstr MI)

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

Definition at line 2572 of file CombinerHelper.cpp.

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

◆ matchUndefStore()

bool CombinerHelper::matchUndefStore ( MachineInstr MI)

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

Definition at line 2578 of file CombinerHelper.cpp.

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

◆ matchXorOfAndWithSameReg()

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

◆ replaceInstWithConstant()

bool CombinerHelper::replaceInstWithConstant ( MachineInstr MI,
int64_t  C 
)

Replace an instruction with a G_CONSTANT with value C.

Definition at line 2746 of file CombinerHelper.cpp.

References assert(), llvm::MachineIRBuilder::buildConstant(), Builder, MI, and llvm::MachineIRBuilder::setInstr().

◆ replaceInstWithFConstant()

bool CombinerHelper::replaceInstWithFConstant ( MachineInstr MI,
double  C 
)

Replace an instruction with a G_FCONSTANT with value C.

Definition at line 2738 of file CombinerHelper.cpp.

References assert(), Builder, llvm::MachineIRBuilder::buildFConstant(), MI, and llvm::MachineIRBuilder::setInstr().

◆ replaceInstWithUndef()

bool CombinerHelper::replaceInstWithUndef ( MachineInstr MI)

Replace an instruction with a G_IMPLICIT_DEF.

Definition at line 2754 of file CombinerHelper.cpp.

References assert(), Builder, llvm::MachineIRBuilder::buildUndef(), MI, and llvm::MachineIRBuilder::setInstr().

◆ replaceRegOpWith()

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

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

Definition at line 133 of file CombinerHelper.cpp.

References assert(), llvm::GISelChangeObserver::changedInstr(), llvm::GISelChangeObserver::changingInstr(), llvm::MachineOperand::getParent(), Observer, and llvm::MachineOperand::setReg().

Referenced by applyCombineExtendingLoads().

◆ replaceRegWith()

void CombinerHelper::replaceRegWith ( MachineRegisterInfo MRI,
Register  FromReg,
Register  ToReg 
) const

◆ replaceSingleDefInstWithOperand()

bool CombinerHelper::replaceSingleDefInstWithOperand ( MachineInstr MI,
unsigned  OpIdx 
)

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

Definition at line 2685 of file CombinerHelper.cpp.

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

◆ replaceSingleDefInstWithReg()

bool CombinerHelper::replaceSingleDefInstWithReg ( MachineInstr MI,
Register  Replacement 
)

Delete MI and replace all of its uses with Replacement.

Definition at line 2696 of file CombinerHelper.cpp.

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

Referenced by applyExtractVecEltBuildVec().

◆ tryCombine()

bool CombinerHelper::tryCombine ( MachineInstr MI)

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

Returns true if changed.

Definition at line 3926 of file CombinerHelper.cpp.

References MI, tryCombineCopy(), tryCombineExtendingLoads(), and tryCombineIndexedLoadStore().

◆ tryCombineConcatVectors()

bool CombinerHelper::tryCombineConcatVectors ( MachineInstr MI)

If MI is G_CONCAT_VECTORS, try to combine it.

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

  • concat_vector(undef, undef) => undef
  • concat_vector(build_vector(A, B), build_vector(C, D)) => build_vector(A, B, C, D)
Precondition
MI.getOpcode() == G_CONCAT_VECTORS.

Definition at line 165 of file CombinerHelper.cpp.

References applyCombineConcatVectors(), matchCombineConcatVectors(), and MI.

◆ tryCombineCopy()

bool CombinerHelper::tryCombineCopy ( MachineInstr MI)

If MI is COPY, try to combine it.

Returns true if MI changed.

Definition at line 144 of file CombinerHelper.cpp.

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

Referenced by tryCombine().

◆ tryCombineExtendingLoads()

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

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

Referenced by tryCombine().

◆ tryCombineIndexedLoadStore()

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

References applyCombineIndexedLoadStore(), matchCombineIndexedLoadStore(), and MI.

Referenced by tryCombine().

◆ tryCombineMemCpyFamily()

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

References assert(), llvm::getConstantVRegValWithLookThrough(), llvm::AMDGPU::HSAMD::Kernel::Arg::Key::IsVolatile, MI, and MRI.

◆ tryCombineShiftToUnmerge()

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

◆ tryCombineShuffleVector()

bool CombinerHelper::tryCombineShuffleVector ( MachineInstr MI)

Try to combine G_SHUFFLE_VECTOR into G_CONCAT_VECTORS.

Returns true if MI changed.

Precondition
MI.getOpcode() == G_SHUFFLE_VECTOR.

Definition at line 242 of file CombinerHelper.cpp.

References applyCombineShuffleVector(), matchCombineShuffleVector(), and MI.

Member Data Documentation

◆ Builder

MachineIRBuilder& llvm::CombinerHelper::Builder
protected

◆ KB

GISelKnownBits* llvm::CombinerHelper::KB
protected

◆ LI

const LegalizerInfo* llvm::CombinerHelper::LI
protected

◆ MDT

MachineDominatorTree* llvm::CombinerHelper::MDT
protected

Definition at line 95 of file CombinerHelper.h.

Referenced by dominates().

◆ MRI

MachineRegisterInfo& llvm::CombinerHelper::MRI
protected

Definition at line 92 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(), applyNotCmp(), applyOptBrCondByInvertingCond(), applyPtrAddImmedChain(), applyRotateOutOfRange(), applySextInRegOfLoad(), applyShiftImmedChain(), applyShiftOfShiftedLogic(), applySimplifyURemByPow2(), applyXorOfAndWithSameReg(), matchAshrShlToSextInreg(), matchBinOpSameVal(), matchCombineAddP2IToPtrAdd(), matchCombineAnyExtTrunc(), matchCombineConcatVectors(), matchCombineConstantFoldFpUnary(), matchCombineConstPtrAddToI2P(), matchCombineCopy(), matchCombineDivRem(), matchCombineExtendingLoads(), matchCombineExtOfExt(), matchCombineFAbsOfFAbs(), matchCombineFNegOfFNeg(), matchCombineI2PToP2I(), matchCombineInsertVecElts(), matchCombineMulToShl(), matchCombineP2IToI2P(), matchCombineShiftToUnmerge(), matchCombineShlOfExtend(), matchCombineShuffleVector(), matchCombineTruncOfExt(), matchCombineTruncOfShl(), matchCombineUnmergeConstant(), matchCombineUnmergeMergeToPlainValues(), matchCombineUnmergeWithDeadLanesToTrunc(), matchCombineUnmergeZExtToZExt(), matchCombineZextTrunc(), matchConstantOp(), matchConstantSelectCmp(), matchEqualDefs(), matchExtendThroughPhis(), matchExtractAllEltsFromBuildVector(), matchExtractVecEltBuildVec(), matchFunnelShiftToRotate(), matchHoistLogicOpWithSameOpcodeHands(), matchLoadOrCombine(), matchNotCmp(), matchOperandIsKnownToBeAPowerOfTwo(), matchOperandIsUndef(), matchOperandIsZero(), matchPtrAddImmedChain(), matchPtrAddZero(), matchRedundantAnd(), matchRedundantOr(), matchRedundantSExtInReg(), matchRotateOutOfRange(), matchSelectSameVal(), matchSextInRegOfLoad(), matchSextTruncSextLoad(), matchShiftImmedChain(), matchShiftOfShiftedLogic(), matchSimplifyAddToSub(), matchUndefSelectCmp(), matchUndefStore(), matchXorOfAndWithSameReg(), replaceRegWith(), replaceSingleDefInstWithOperand(), replaceSingleDefInstWithReg(), and tryCombineMemCpyFamily().

◆ Observer

GISelChangeObserver& llvm::CombinerHelper::Observer
protected

The documentation for this class was generated from the following files:
a
=0.0 ? 0.0 :(a > 0.0 ? 1.0 :-1.0) a
Definition: README.txt:489
val
The initial backend is deliberately restricted to z10 We should add support for later architectures at some point If an asm ties an i32 r result to an i64 the input will be treated as an leaving the upper bits uninitialised For i64 store i32 val
Definition: README.txt:15
N
#define N