LLVM
15.0.0git
|
#include "llvm/CodeGen/GlobalISel/LegalizerHelper.h"
#include "llvm/CodeGen/GlobalISel/CallLowering.h"
#include "llvm/CodeGen/GlobalISel/GISelChangeObserver.h"
#include "llvm/CodeGen/GlobalISel/GenericMachineInstrs.h"
#include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
#include "llvm/CodeGen/GlobalISel/LostDebugLocObserver.h"
#include "llvm/CodeGen/GlobalISel/MIPatternMatch.h"
#include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
#include "llvm/CodeGen/GlobalISel/Utils.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/TargetFrameLowering.h"
#include "llvm/CodeGen/TargetInstrInfo.h"
#include "llvm/CodeGen/TargetLowering.h"
#include "llvm/CodeGen/TargetOpcodes.h"
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/IR/Instructions.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Target/TargetMachine.h"
Go to the source code of this file.
Macros | |
#define | DEBUG_TYPE "legalizer" |
#define | RTLIBCASE_INT(LibcallPrefix) |
#define | RTLIBCASE(LibcallPrefix) |
Functions | |
static std::pair< int, int > | getNarrowTypeBreakDown (LLT OrigTy, LLT NarrowTy, LLT &LeftoverTy) |
Try to break down OrigTy into NarrowTy sized pieces. More... | |
static Type * | getFloatTypeForLLT (LLVMContext &Ctx, LLT Ty) |
static void | getUnmergeResults (SmallVectorImpl< Register > &Regs, const MachineInstr &MI) |
Append the result registers of G_UNMERGE_VALUES MI to Regs . More... | |
static RTLIB::Libcall | getRTLibDesc (unsigned Opcode, unsigned Size) |
static bool | isLibCallInTailPosition (MachineInstr &MI, const TargetInstrInfo &TII, MachineRegisterInfo &MRI) |
True if an instruction is in tail position in its caller. More... | |
static LegalizerHelper::LegalizeResult | simpleLibcall (MachineInstr &MI, MachineIRBuilder &MIRBuilder, unsigned Size, Type *OpType) |
static RTLIB::Libcall | getConvRTLibDesc (unsigned Opcode, Type *ToType, Type *FromType) |
static LegalizerHelper::LegalizeResult | conversionLibcall (MachineInstr &MI, MachineIRBuilder &MIRBuilder, Type *ToType, Type *FromType) |
static void | getUnmergePieces (SmallVectorImpl< Register > &Pieces, MachineIRBuilder &B, Register Src, LLT Ty) |
static Register | getBitcastWiderVectorElementOffset (MachineIRBuilder &B, Register Idx, unsigned NewEltSize, unsigned OldEltSize) |
Figure out the bit offset into a register when coercing a vector index for the wide element type. More... | |
static Register | buildBitFieldInsert (MachineIRBuilder &B, Register TargetReg, Register InsertReg, Register OffsetBits) |
Emit code to insert InsertReg into TargetRet at OffsetBits in TargetReg , while preserving other bits in TargetReg . More... | |
static Register | clampDynamicVectorIndex (MachineIRBuilder &B, Register IdxReg, LLT VecTy) |
static bool | hasSameNumEltsOnAllVectorOperands (GenericMachineInstr &MI, MachineRegisterInfo &MRI, std::initializer_list< unsigned > NonVecOpIndices) |
Check that all vector operands have same number of elements. More... | |
static void | makeDstOps (SmallVectorImpl< DstOp > &DstOps, LLT Ty, unsigned NumElts) |
Fill DstOps with DstOps that have same number of elements combined as the Ty. More... | |
static void | broadcastSrcOp (SmallVectorImpl< SrcOp > &Ops, unsigned N, MachineOperand &Op) |
Operand Op is used on N sub-instructions. More... | |
static unsigned | getScalarOpcForReduction (unsigned Opc) |
static bool | isNonZeroModBitWidthOrUndef (const MachineRegisterInfo &MRI, Register Reg, unsigned BW) |
static CmpInst::Predicate | minMaxToCompare (unsigned Opc) |
static MachineInstrBuilder | SwapN (unsigned N, DstOp Dst, MachineIRBuilder &B, MachineInstrBuilder Src, APInt Mask) |
static bool | shouldLowerMemFuncForSize (const MachineFunction &MF) |
static bool | findGISelOptimalMemOpLowering (std::vector< LLT > &MemOps, unsigned Limit, const MemOp &Op, unsigned DstAS, unsigned SrcAS, const AttributeList &FuncAttributes, const TargetLowering &TLI) |
static Type * | getTypeForLLT (LLT Ty, LLVMContext &C) |
static Register | getMemsetValue (Register Val, LLT Ty, MachineIRBuilder &MIB) |
#define DEBUG_TYPE "legalizer" |
Definition at line 37 of file LegalizerHelper.cpp.
#define RTLIBCASE | ( | LibcallPrefix | ) |
#define RTLIBCASE_INT | ( | LibcallPrefix | ) |
|
static |
Operand Op
is used on N
sub-instructions.
Fill Ops
with N
SrcOps made from Op
depending on operand type.
Definition at line 3712 of file LegalizerHelper.cpp.
References i, llvm_unreachable, and N.
Referenced by llvm::LegalizerHelper::fewerElementsVectorMultiEltType().
|
static |
Emit code to insert InsertReg
into TargetRet
at OffsetBits
in TargetReg
, while preserving other bits in TargetReg
.
(InsertReg << Offset) | (TargetReg & ~(-1 >> InsertReg.size()) << Offset)
Definition at line 2883 of file LegalizerHelper.cpp.
References B, llvm::APInt::getLowBitsSet(), and llvm::LLT::getSizeInBits().
Referenced by llvm::LegalizerHelper::bitcastInsertVectorElt().
|
static |
Definition at line 3612 of file LegalizerHelper.cpp.
References B, llvm::APInt::getLowBitsSet(), llvm::LLT::getNumElements(), llvm::LLT::getSizeInBits(), llvm::isPowerOf2_32(), llvm::Log2_32(), llvm::MIPatternMatch::m_ICst(), and llvm::MIPatternMatch::mi_match().
Referenced by llvm::LegalizerHelper::getVectorElementPointer().
|
static |
Definition at line 781 of file LegalizerHelper.cpp.
References llvm::createLibcall(), getConvRTLibDesc(), getReg(), and MI.
Referenced by llvm::LegalizerHelper::libcall().
|
static |
Definition at line 7391 of file LegalizerHelper.cpp.
References llvm::TargetLoweringBase::allowsMisalignedMemoryAccesses(), assert(), llvm::getMVTForLLT(), llvm::TargetLoweringBase::getOptimalMemOpLLT(), llvm::LLT::getSizeInBits(), llvm::LLT::getSizeInBytes(), llvm::LLT::isVector(), llvm::MachineMemOperand::MONone, llvm::PowerOf2Floor(), and llvm::LLT::scalar().
|
static |
Figure out the bit offset into a register when coercing a vector index for the wide element type.
This is only for the case when promoting vector to one with larger elements. offset_idx = G_AND idx, ~(-1 << Log2(DstEltSize / SrcEltSize)) offset_bits = G_SHL offset_idx, Log2(SrcEltSize)
Definition at line 2751 of file LegalizerHelper.cpp.
References B, llvm::APInt::getAllOnes(), llvm::LLT::getSizeInBits(), and llvm::Log2_32().
Referenced by llvm::LegalizerHelper::bitcastExtractVectorElt(), and llvm::LegalizerHelper::bitcastInsertVectorElt().
|
static |
Definition at line 758 of file LegalizerHelper.cpp.
References llvm::RTLIB::getFPEXT(), llvm::RTLIB::getFPROUND(), llvm::RTLIB::getFPTOSINT(), llvm::RTLIB::getFPTOUINT(), llvm::RTLIB::getSINTTOFP(), llvm::RTLIB::getUINTTOFP(), llvm::MVT::getVT(), and llvm_unreachable.
Referenced by conversionLibcall().
|
static |
Definition at line 77 of file LegalizerHelper.cpp.
References llvm::Type::getDoubleTy(), llvm::Type::getFloatTy(), llvm::Type::getFP128Ty(), llvm::Type::getHalfTy(), llvm::LLT::getSizeInBits(), llvm::Type::getX86_FP80Ty(), and llvm::LLT::isScalar().
Referenced by llvm::LegalizerHelper::libcall().
|
static |
Definition at line 7464 of file LegalizerHelper.cpp.
References llvm::MachineIRBuilder::buildConstant(), llvm::MachineIRBuilder::buildMul(), llvm::MachineIRBuilder::buildSplatVector(), llvm::MachineIRBuilder::buildZExtOrTrunc(), llvm::getIConstantVRegValWithLookThrough(), llvm::MachineIRBuilder::getMRI(), llvm::MachineInstrBuilder::getReg(), llvm::LLT::getScalarSizeInBits(), llvm::LLT::getScalarType(), llvm::APInt::getSplat(), llvm::LLT::isVector(), llvm::msf::Magic, and MRI.
|
static |
Try to break down OrigTy
into NarrowTy
sized pieces.
Returns the number of NarrowTy
elements needed to reconstruct OrigTy
, with any leftover piece as type LeftoverTy
Returns -1 in the first element of the pair if the breakdown is not satisfiable.
Definition at line 51 of file LegalizerHelper.cpp.
References assert(), llvm::LinearPolySize< ElementCount >::getFixed(), llvm::LLT::getScalarSizeInBits(), llvm::LLT::getSizeInBits(), llvm::LLT::isValid(), llvm::LLT::isVector(), llvm::LLT::scalar(), and llvm::LLT::scalarOrVector().
Referenced by makeDstOps(), and llvm::LegalizerHelper::reduceLoadStoreWidth().
|
static |
Definition at line 468 of file LegalizerHelper.cpp.
References llvm_unreachable, RTLIBCASE, and RTLIBCASE_INT.
Referenced by simpleLibcall().
|
static |
Definition at line 4445 of file LegalizerHelper.cpp.
References llvm_unreachable.
Referenced by llvm::LegalizerHelper::fewerElementsVectorReductions().
|
static |
Definition at line 7456 of file LegalizerHelper.cpp.
References llvm::IntegerType::get(), llvm::FixedVectorType::get(), llvm::LLT::getNumElements(), llvm::LLT::getScalarSizeInBits(), llvm::LLT::getSizeInBits(), and llvm::LLT::isVector().
|
static |
Definition at line 2669 of file LegalizerHelper.cpp.
Referenced by llvm::LegalizerHelper::lowerBitcast().
|
static |
Append the result registers of G_UNMERGE_VALUES MI
to Regs
.
Definition at line 311 of file LegalizerHelper.cpp.
References assert(), I, MI, and llvm::SmallVectorImpl< T >::resize().
|
static |
Check that all vector operands have same number of elements.
Other operands should be listed in NonVecOp.
Definition at line 3651 of file LegalizerHelper.cpp.
References llvm::LLT::getNumElements(), llvm::MachineRegisterInfo::getType(), llvm::is_contained(), llvm::LLT::isVector(), MI, and MRI.
Referenced by llvm::LegalizerHelper::fewerElementsVectorMultiEltType().
|
static |
True if an instruction is in tail position in its caller.
Intended for legalizing libcalls as tail calls when possible.
Definition at line 560 of file LegalizerHelper.cpp.
References F, llvm::MachineFunction::getFunction(), llvm::MachineBasicBlock::getParent(), llvm::AttributeList::getRetAttrs(), llvm::AttrBuilder::hasAttributes(), llvm::AttributeList::hasRetAttr(), llvm::MachineBasicBlock::instr_end(), llvm::Register::isPhysical(), llvm::HexagonInstrInfo::isTailCall(), llvm::Register::isVirtual(), llvm_unreachable, MBB, MI, llvm::next_nodbg(), llvm::AttrBuilder::removeAttribute(), llvm::MipsISD::Ret, and TII.
Referenced by llvm::createMemLibcall().
|
static |
Definition at line 5753 of file LegalizerHelper.cpp.
References llvm::ConstantInt::getValue(), llvm::matchUnaryPredicate(), MRI, and llvm::APInt::urem().
Referenced by llvm::LegalizerHelper::lowerFunnelShiftAsShifts(), and llvm::LegalizerHelper::lowerFunnelShiftWithInverse().
|
static |
Fill DstOps
with DstOps that have same number of elements combined as the Ty.
These DstOps have either scalar type when NumElts
= 1 or are vectors with NumElts
elements. When Ty.getNumElements() is not multiple of NumElts
last DstOp (leftover) has fewer then NumElts
elements.
Definition at line 3689 of file LegalizerHelper.cpp.
References assert(), llvm::LLT::fixed_vector(), llvm::LLT::getElementType(), getNarrowTypeBreakDown(), i, llvm::LLT::isValid(), and llvm::LLT::isVector().
Referenced by llvm::LegalizerHelper::fewerElementsVectorMultiEltType(), and llvm::LegalizerHelper::fewerElementsVectorPhi().
|
static |
Definition at line 6355 of file LegalizerHelper.cpp.
References llvm::CmpInst::ICMP_SGT, llvm::CmpInst::ICMP_SLT, llvm::CmpInst::ICMP_UGT, llvm::CmpInst::ICMP_ULT, and llvm_unreachable.
Referenced by llvm::LegalizerHelper::lowerMinMax().
|
static |
Definition at line 7381 of file LegalizerHelper.cpp.
References llvm::MachineFunction::getFunction(), llvm::MachineFunction::getTarget(), llvm::TargetMachine::getTargetTriple(), llvm::Function::hasMinSize(), llvm::Function::hasOptSize(), and llvm::Triple::isOSDarwin().
Referenced by llvm::LegalizerHelper::lowerMemCpyFamily().
|
static |
Definition at line 658 of file LegalizerHelper.cpp.
References llvm::AMDGPU::HSAMD::Kernel::Key::Args, llvm::createLibcall(), llvm::drop_begin(), getReg(), getRTLibDesc(), and MI.
Referenced by llvm::LegalizerHelper::libcall().
|
static |
Definition at line 7180 of file LegalizerHelper.cpp.
References B, LHS, llvm::BitmaskEnumDetail::Mask(), N, and RHS.
Referenced by llvm::LegalizerHelper::lowerBitreverse().