LLVM 20.0.0git
Macros | Functions
LegalizerHelper.cpp File Reference
#include "llvm/CodeGen/GlobalISel/LegalizerHelper.h"
#include "llvm/CodeGen/GlobalISel/CallLowering.h"
#include "llvm/CodeGen/GlobalISel/GISelChangeObserver.h"
#include "llvm/CodeGen/GlobalISel/GISelKnownBits.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/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)
 

Functions

static std::pair< int, int > getNarrowTypeBreakDown (LLT OrigTy, LLT NarrowTy, LLT &LeftoverTy)
 Try to break down OrigTy into NarrowTy sized pieces.
 
static TypegetFloatTypeForLLT (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)
 
static RTLIB::Libcall getStateLibraryFunctionFor (MachineInstr &MI, const TargetLowering &TLI)
 
static std::pair< RTLIB::Libcall, CmpInst::PredicategetFCMPLibcallDesc (const CmpInst::Predicate Pred)
 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 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)
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "legalizer"

Definition at line 42 of file LegalizerHelper.cpp.

◆ LCALL5

#define LCALL5 (   A)     LCALLS(A, 1), LCALLS(A, 2), LCALLS(A, 4), LCALLS(A, 8), LCALLS(A, 16)

◆ LCALLS

#define LCALLS (   A,
  B 
)    {A##B##_RELAX, A##B##_ACQ, A##B##_REL, A##B##_ACQ_REL}

◆ RTLIBCASE

#define RTLIBCASE (   LibcallPrefix)
Value:
do { \
switch (Size) { \
case 32: \
return RTLIB::LibcallPrefix##32; \
case 64: \
return RTLIB::LibcallPrefix##64; \
case 80: \
return RTLIB::LibcallPrefix##80; \
case 128: \
return RTLIB::LibcallPrefix##128; \
default: \
llvm_unreachable("unexpected size"); \
} \
} while (0)
uint64_t Size

◆ RTLIBCASE_INT

#define RTLIBCASE_INT (   LibcallPrefix)
Value:
do { \
switch (Size) { \
case 32: \
return RTLIB::LibcallPrefix##32; \
case 64: \
return RTLIB::LibcallPrefix##64; \
case 128: \
return RTLIB::LibcallPrefix##128; \
default: \
llvm_unreachable("unexpected size"); \
} \
} while (0)

Function Documentation

◆ broadcastSrcOp()

static void broadcastSrcOp ( SmallVectorImpl< SrcOp > &  Ops,
unsigned  N,
MachineOperand Op 
)
static

Operand Op is used on N sub-instructions.

Fill Ops with N SrcOps made from Op depending on operand type.

Definition at line 4425 of file LegalizerHelper.cpp.

References llvm_unreachable, N, and llvm::SmallVectorTemplateBase< T, bool >::push_back().

Referenced by llvm::LegalizerHelper::fewerElementsVectorMultiEltType().

◆ buildBitFieldInsert()

static Register buildBitFieldInsert ( MachineIRBuilder B,
Register  TargetReg,
Register  InsertReg,
Register  OffsetBits 
)
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 3483 of file LegalizerHelper.cpp.

References B, llvm::APInt::getLowBitsSet(), and llvm::LLT::getSizeInBits().

Referenced by llvm::LegalizerHelper::bitcastInsertVectorElt().

◆ clampVectorIndex()

static Register clampVectorIndex ( MachineIRBuilder B,
Register  IdxReg,
LLT  VecTy 
)
static

◆ conversionLibcall()

static LegalizerHelper::LegalizeResult conversionLibcall ( MachineInstr MI,
MachineIRBuilder MIRBuilder,
Type ToType,
Type FromType,
LostDebugLocObserver LocObserver 
)
static

◆ createAtomicLibcall()

static LegalizerHelper::LegalizeResult createAtomicLibcall ( MachineIRBuilder MIRBuilder,
MachineInstr MI 
)
static

◆ emitLoadFromConstantPool()

static void emitLoadFromConstantPool ( Register  DstReg,
const Constant ConstVal,
MachineIRBuilder MIRBuilder 
)
static

◆ findGISelOptimalMemOpLowering()

static bool findGISelOptimalMemOpLowering ( std::vector< LLT > &  MemOps,
unsigned  Limit,
const MemOp Op,
unsigned  DstAS,
unsigned  SrcAS,
const AttributeList FuncAttributes,
const TargetLowering TLI 
)
static

◆ getBitcastWiderVectorElementOffset()

static Register getBitcastWiderVectorElementOffset ( MachineIRBuilder B,
Register  Idx,
unsigned  NewEltSize,
unsigned  OldEltSize 
)
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 3355 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().

◆ getConvRTLibDesc()

static RTLIB::Libcall getConvRTLibDesc ( unsigned  Opcode,
Type ToType,
Type FromType 
)
static

◆ getFCMPLibcallDesc()

static std::pair< RTLIB::Libcall, CmpInst::Predicate > getFCMPLibcallDesc ( const CmpInst::Predicate  Pred)
static

◆ getFloatTypeForLLT()

static Type * getFloatTypeForLLT ( LLVMContext Ctx,
LLT  Ty 
)
static

◆ getMemsetValue()

static Register getMemsetValue ( Register  Val,
LLT  Ty,
MachineIRBuilder MIB 
)
static

◆ getNarrowTypeBreakDown()

static std::pair< int, int > getNarrowTypeBreakDown ( LLT  OrigTy,
LLT  NarrowTy,
LLT LeftoverTy 
)
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 56 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().

◆ getOutlineAtomicLibcall()

static RTLIB::Libcall getOutlineAtomicLibcall ( MachineInstr MI)
static

Definition at line 728 of file LegalizerHelper.cpp.

References llvm::LLT::getSizeInBytes(), llvm::LLT::isVector(), LCALL5, and MI.

Referenced by createAtomicLibcall().

◆ getRTLibDesc()

static RTLIB::Libcall getRTLibDesc ( unsigned  Opcode,
unsigned  Size 
)
static

Definition at line 382 of file LegalizerHelper.cpp.

References llvm_unreachable, RTLIBCASE, and RTLIBCASE_INT.

Referenced by llvm::LegalizerHelper::libcall(), and simpleLibcall().

◆ getStateLibraryFunctionFor()

static RTLIB::Libcall getStateLibraryFunctionFor ( MachineInstr MI,
const TargetLowering TLI 
)
static

Definition at line 885 of file LegalizerHelper.cpp.

References llvm_unreachable, and MI.

◆ getUnmergePieces()

static void getUnmergePieces ( SmallVectorImpl< Register > &  Pieces,
MachineIRBuilder B,
Register  Src,
LLT  Ty 
)
static

◆ getUnmergeResults()

static void getUnmergeResults ( SmallVectorImpl< Register > &  Regs,
const MachineInstr MI 
)
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().

◆ hasSameNumEltsOnAllVectorOperands()

static bool hasSameNumEltsOnAllVectorOperands ( GenericMachineInstr MI,
MachineRegisterInfo MRI,
std::initializer_list< unsigned NonVecOpIndices 
)
static

Check that all vector operands have same number of elements.

Other operands should be listed in NonVecOp.

Definition at line 4364 of file LegalizerHelper.cpp.

References llvm::LLT::getNumElements(), llvm::is_contained(), llvm::LLT::isVector(), MI, and MRI.

Referenced by llvm::LegalizerHelper::fewerElementsVectorMultiEltType().

◆ isLibCallInTailPosition()

static bool isLibCallInTailPosition ( const CallLowering::ArgInfo Result,
MachineInstr MI,
const TargetInstrInfo TII,
MachineRegisterInfo MRI 
)
static

◆ isNonZeroModBitWidthOrUndef()

static bool isNonZeroModBitWidthOrUndef ( const MachineRegisterInfo MRI,
Register  Reg,
unsigned  BW 
)
static

◆ makeDstOps()

static void makeDstOps ( SmallVectorImpl< DstOp > &  DstOps,
LLT  Ty,
unsigned  NumElts 
)
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 4402 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().

◆ minMaxToCompare()

static CmpInst::Predicate minMaxToCompare ( unsigned  Opc)
static

◆ shouldLowerMemFuncForSize()

static bool shouldLowerMemFuncForSize ( const MachineFunction MF)
static

◆ simpleLibcall()

static LegalizerHelper::LegalizeResult simpleLibcall ( MachineInstr MI,
MachineIRBuilder MIRBuilder,
unsigned  Size,
Type OpType,
LostDebugLocObserver LocObserver 
)
static

◆ SwapN()

static MachineInstrBuilder SwapN ( unsigned  N,
DstOp  Dst,
MachineIRBuilder B,
MachineInstrBuilder  Src,
const APInt Mask 
)
static

Definition at line 8359 of file LegalizerHelper.cpp.

References B, LHS, N, and RHS.

Referenced by llvm::LegalizerHelper::lowerBitreverse().