LLVM 22.0.0git
|
#include "llvm/CodeGen/GlobalISel/LegalizerHelper.h"
#include "llvm/CodeGen/GlobalISel/CallLowering.h"
#include "llvm/CodeGen/GlobalISel/GISelChangeObserver.h"
#include "llvm/CodeGen/GlobalISel/GISelValueTracking.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/LowLevelTypeUtils.h"
#include "llvm/CodeGen/MachineConstantPool.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/RuntimeLibcallUtil.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"
#include <numeric>
#include <optional>
Go to the source code of this file.
Macros | |
#define | DEBUG_TYPE "legalizer" |
#define | RTLIBCASE_INT(LibcallPrefix) |
#define | RTLIBCASE(LibcallPrefix) |
#define | LCALLS(A, B) {A##B##_RELAX, A##B##_ACQ, A##B##_REL, A##B##_ACQ_REL} |
#define | LCALL5(A) LCALLS(A, 1), LCALLS(A, 2), LCALLS(A, 4), LCALLS(A, 8), LCALLS(A, 16) |
#define | RTLIBCASE_CMP(LibcallPrefix, ICmpPred) |
Functions | |
static std::pair< int, int > | getNarrowTypeBreakDown (LLT OrigTy, LLT NarrowTy, LLT &LeftoverTy) |
Try to break down OrigTy into NarrowTy sized pieces. | |
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 . | |
static RTLIB::Libcall | getRTLibDesc (unsigned Opcode, unsigned Size) |
static bool | isLibCallInTailPosition (const CallLowering::ArgInfo &Result, MachineInstr &MI, const TargetInstrInfo &TII, MachineRegisterInfo &MRI) |
True if an instruction is in tail position in its caller. | |
static LegalizerHelper::LegalizeResult | simpleLibcall (MachineInstr &MI, MachineIRBuilder &MIRBuilder, unsigned Size, Type *OpType, LostDebugLocObserver &LocObserver) |
static RTLIB::Libcall | getOutlineAtomicLibcall (MachineInstr &MI) |
static LegalizerHelper::LegalizeResult | createAtomicLibcall (MachineIRBuilder &MIRBuilder, MachineInstr &MI) |
static RTLIB::Libcall | getConvRTLibDesc (unsigned Opcode, Type *ToType, Type *FromType) |
static LegalizerHelper::LegalizeResult | conversionLibcall (MachineInstr &MI, MachineIRBuilder &MIRBuilder, Type *ToType, Type *FromType, LostDebugLocObserver &LocObserver, const TargetLowering &TLI, bool IsSigned=false) |
static RTLIB::Libcall | getStateLibraryFunctionFor (MachineInstr &MI, const TargetLowering &TLI) |
static std::pair< RTLIB::Libcall, CmpInst::Predicate > | getFCMPLibcallDesc (const CmpInst::Predicate Pred, unsigned Size) |
Returns the corresponding libcall for the given Pred and the ICMP predicate that should be generated to compare with #0 after the libcall. | |
static void | getUnmergePieces (SmallVectorImpl< Register > &Pieces, MachineIRBuilder &B, Register Src, LLT Ty) |
static void | emitLoadFromConstantPool (Register DstReg, const Constant *ConstVal, MachineIRBuilder &MIRBuilder) |
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. | |
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 . | |
static Register | clampVectorIndex (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. | |
static void | makeDstOps (SmallVectorImpl< DstOp > &DstOps, LLT Ty, unsigned NumElts) |
Fill DstOps with DstOps that have same number of elements combined as the Ty. | |
static void | broadcastSrcOp (SmallVectorImpl< SrcOp > &Ops, unsigned N, MachineOperand &Op) |
Operand Op is used on N sub-instructions. | |
static bool | isNonZeroModBitWidthOrUndef (const MachineRegisterInfo &MRI, Register Reg, unsigned BW) |
static LegalizerHelper::LegalizeResult | loweri64tof16ITOFP (MachineInstr &MI, Register Dst, LLT DstTy, Register Src, LLT SrcTy, MachineIRBuilder &MIRBuilder) |
i64->fp16 itofp can be lowered to i64->f64,f64->f32,f32->f16. | |
static CmpInst::Predicate | minMaxToCompare (unsigned Opc) |
static MachineInstrBuilder | SwapN (unsigned N, DstOp Dst, MachineIRBuilder &B, MachineInstrBuilder Src, const 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 Register | getMemsetValue (Register Val, LLT Ty, MachineIRBuilder &MIB) |
#define DEBUG_TYPE "legalizer" |
Definition at line 43 of file LegalizerHelper.cpp.
#define RTLIBCASE | ( | LibcallPrefix | ) |
#define RTLIBCASE_CMP | ( | LibcallPrefix, | |
ICmpPred | |||
) |
#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 4928 of file LegalizerHelper.cpp.
References llvm_unreachable, N, and llvm::SmallVectorTemplateBase< T, bool >::push_back().
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 3744 of file LegalizerHelper.cpp.
References B, llvm::APInt::getLowBitsSet(), and llvm::LLT::getSizeInBits().
Referenced by llvm::LegalizerHelper::bitcastInsertVectorElt().
|
static |
Definition at line 4817 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 942 of file LegalizerHelper.cpp.
References llvm::createLibcall(), llvm::CallLowering::BaseArgInfo::Flags, getConvRTLibDesc(), getReg(), llvm::LegalizeActions::Libcall, MI, and llvm::TargetLoweringBase::shouldSignExtendTypeInLibCall().
Referenced by llvm::LegalizerHelper::libcall().
|
static |
Definition at line 842 of file LegalizerHelper.cpp.
References llvm::append_range(), llvm::MachineIRBuilder::buildConstant(), llvm::MachineIRBuilder::buildSub(), llvm::MachineIRBuilder::buildXor(), llvm::MachineOperand::CreateES(), llvm::dbgs(), llvm::IntegerType::get(), llvm::StructType::get(), llvm::PointerType::get(), llvm::TargetSubtargetInfo::getCallLowering(), llvm::Function::getContext(), llvm::MachineFunction::getFunction(), llvm::MachineIRBuilder::getMF(), llvm::MCInstrInfo::getName(), getOutlineAtomicLibcall(), llvm::MachineInstrBuilder::getReg(), llvm::LLT::getSizeInBits(), llvm::MachineFunction::getSubtarget(), llvm::TargetSubtargetInfo::getTargetLowering(), llvm::MachineIRBuilder::getTII(), Info, llvm::LegalizerHelper::Legalized, LLVM_DEBUG, llvm_unreachable, MI, Name, Opc, llvm::SmallVectorTemplateBase< T, bool >::push_back(), RetTy, llvm::Success, and llvm::LegalizerHelper::UnableToLegalize.
Referenced by llvm::LegalizerHelper::libcall().
|
static |
Definition at line 3501 of file LegalizerHelper.cpp.
References Addr, llvm::MachineIRBuilder::buildConstantPool(), llvm::MachineIRBuilder::buildLoadInstr(), DL, llvm::MachineFunction::getConstantPool(), llvm::MachinePointerInfo::getConstantPool(), llvm::MachineConstantPool::getConstantPoolIndex(), llvm::MachineIRBuilder::getDataLayout(), llvm::MachineFunction::getMachineMemOperand(), llvm::MachineIRBuilder::getMF(), llvm::MachineIRBuilder::getMRI(), llvm::Value::getType(), llvm::MachineMemOperand::MOLoad, MRI, and llvm::LLT::pointer().
Referenced by llvm::LegalizerHelper::lowerConstant(), and llvm::LegalizerHelper::lowerFConstant().
|
static |
Definition at line 9639 of file LegalizerHelper.cpp.
References llvm::TargetLoweringBase::allowsMisalignedMemoryAccesses(), assert(), llvm::bit_floor(), llvm::CallingConv::Fast, llvm::getMVTForLLT(), llvm::TargetLoweringBase::getOptimalMemOpLLT(), llvm::LLT::getSizeInBits(), llvm::LLT::getSizeInBytes(), llvm::LLT::isVector(), llvm::MachineMemOperand::MONone, llvm::LLT::scalar(), and Size.
|
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 3616 of file LegalizerHelper.cpp.
References B, llvm::APInt::getAllOnes(), llvm::LLT::getSizeInBits(), Idx, and llvm::Log2_32().
Referenced by llvm::LegalizerHelper::bitcastExtractVectorElt(), and llvm::LegalizerHelper::bitcastInsertVectorElt().
Definition at line 919 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 |
Returns the corresponding libcall for the given Pred and the ICMP predicate that should be generated to compare with #0 after the libcall.
Definition at line 1073 of file LegalizerHelper.cpp.
References llvm::CmpInst::BAD_ICMP_PREDICATE, llvm::CmpInst::FCMP_OEQ, llvm::CmpInst::FCMP_OGE, llvm::CmpInst::FCMP_OGT, llvm::CmpInst::FCMP_OLE, llvm::CmpInst::FCMP_OLT, llvm::CmpInst::FCMP_UNE, llvm::CmpInst::FCMP_UNO, llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_NE, llvm::CmpInst::ICMP_SGE, llvm::CmpInst::ICMP_SGT, llvm::CmpInst::ICMP_SLE, llvm::CmpInst::ICMP_SLT, and RTLIBCASE_CMP.
|
static |
Definition at line 84 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 9705 of file LegalizerHelper.cpp.
References llvm::MachineIRBuilder::buildConstant(), llvm::MachineIRBuilder::buildMul(), llvm::MachineIRBuilder::buildSplatBuildVector(), llvm::MachineIRBuilder::buildZExtOrTrunc(), llvm::getIConstantVRegValWithLookThrough(), llvm::MachineIRBuilder::getMRI(), llvm::MachineInstrBuilder::getReg(), llvm::LLT::getScalarSizeInBits(), llvm::LLT::getScalarType(), llvm::APInt::getSplat(), llvm::LLT::isVector(), and MRI.
Referenced by getMemsetStores().
|
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 57 of file LegalizerHelper.cpp.
References assert(), llvm::LLT::getElementType(), llvm::ElementCount::getFixed(), llvm::LLT::getScalarSizeInBits(), llvm::LLT::getSizeInBits(), llvm::LLT::isValid(), llvm::LLT::isVector(), llvm::LLT::scalar(), llvm::LLT::scalarOrVector(), and Size.
Referenced by makeDstOps(), and llvm::LegalizerHelper::reduceLoadStoreWidth().
|
static |
Definition at line 794 of file LegalizerHelper.cpp.
References llvm::LLT::getSizeInBytes(), llvm::LLT::isVector(), LCALL5, MI, and Opc.
Referenced by createAtomicLibcall().
Definition at line 382 of file LegalizerHelper.cpp.
References llvm_unreachable, RTLIBCASE, and RTLIBCASE_INT.
Referenced by llvm::LegalizerHelper::libcall(), and simpleLibcall().
|
static |
Definition at line 960 of file LegalizerHelper.cpp.
References llvm_unreachable, and MI.
|
static |
Definition at line 3494 of file LegalizerHelper.cpp.
References B, I, and llvm::SmallVectorTemplateBase< T, bool >::push_back().
Referenced by llvm::LegalizerHelper::lowerBitcast().
|
static |
Append the result registers of G_UNMERGE_VALUES MI
to Regs
.
Definition at line 225 of file LegalizerHelper.cpp.
References assert(), I, MI, llvm::SmallVectorImpl< T >::resize(), and llvm::SmallVectorBase< Size_T >::size().
Referenced by llvm::LegalizerHelper::fewerElementsBitcast().
|
static |
Check that all vector operands have same number of elements.
Other operands should be listed in NonVecOp.
Definition at line 4867 of file LegalizerHelper.cpp.
References llvm::LLT::getNumElements(), llvm::is_contained(), llvm::LLT::isVector(), MI, MRI, and OpIdx.
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 514 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(), MBB, MI, llvm::next_nodbg(), llvm::AttrBuilder::removeAttribute(), and TII.
Referenced by llvm::createLibcall(), and llvm::createMemLibcall().
|
static |
Definition at line 7274 of file LegalizerHelper.cpp.
References llvm::CallingConv::C, llvm::ConstantInt::getValue(), llvm::matchUnaryPredicate(), MRI, and llvm::APInt::urem().
Referenced by llvm::TargetLowering::expandFunnelShift(), expandVPFunnelShift(), llvm::LegalizerHelper::lowerFunnelShiftAsShifts(), and llvm::LegalizerHelper::lowerFunnelShiftWithInverse().
|
static |
i64->fp16 itofp can be lowered to i64->f64,f64->f32,f32->f16.
We cannot convert fpround f64->f16 without double-rounding, so we manually perform the lowering here where we know it is valid.
Definition at line 7715 of file LegalizerHelper.cpp.
References llvm::MachineIRBuilder::buildFPTrunc(), llvm::MachineIRBuilder::buildSITOFP(), llvm::MachineIRBuilder::buildUITOFP(), llvm::LLT::changeElementSize(), llvm::LegalizerHelper::Legalized, llvm::M1(), and MI.
Referenced by llvm::LegalizerHelper::lowerSITOFP(), and llvm::LegalizerHelper::lowerUITOFP().
|
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 4905 of file LegalizerHelper.cpp.
References assert(), llvm::LLT::fixed_vector(), llvm::LLT::getElementType(), getNarrowTypeBreakDown(), llvm::LLT::isValid(), llvm::LLT::isVector(), and llvm::SmallVectorTemplateBase< T, bool >::push_back().
Referenced by llvm::LegalizerHelper::fewerElementsVectorMultiEltType(), and llvm::LegalizerHelper::fewerElementsVectorPhi().
|
static |
Definition at line 8145 of file LegalizerHelper.cpp.
References llvm::CmpInst::ICMP_SGT, llvm::CmpInst::ICMP_SLT, llvm::CmpInst::ICMP_UGT, llvm::CmpInst::ICMP_ULT, llvm_unreachable, and Opc.
Referenced by llvm::LegalizerHelper::lowerMinMax().
|
static |
Definition at line 9629 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 getMemcpyLoadsAndStores(), getMemmoveLoadsAndStores(), getMemsetStores(), and llvm::LegalizerHelper::lowerMemCpyFamily().
|
static |
Definition at line 640 of file LegalizerHelper.cpp.
References llvm::createLibcall(), llvm::drop_begin(), getReg(), getRTLibDesc(), llvm::LegalizeActions::Libcall, MI, and Size.
Referenced by llvm::LegalizerHelper::libcall().
|
static |
Definition at line 9116 of file LegalizerHelper.cpp.
References B, LHS, N, and RHS.
Referenced by llvm::LegalizerHelper::lowerBitreverse().