LLVM 22.0.0git
Classes | Macros | Enumerations | Functions
AMDGPUInstructionSelector.cpp File Reference

This file implements the targeting of the InstructionSelector class for AMDGPU. More...

#include "AMDGPUInstructionSelector.h"
#include "AMDGPU.h"
#include "AMDGPUGlobalISelUtils.h"
#include "AMDGPUInstrInfo.h"
#include "AMDGPURegisterBankInfo.h"
#include "AMDGPUTargetMachine.h"
#include "SIMachineFunctionInfo.h"
#include "Utils/AMDGPUBaseInfo.h"
#include "llvm/CodeGen/GlobalISel/GIMatchTableExecutorImpl.h"
#include "llvm/CodeGen/GlobalISel/GISelValueTracking.h"
#include "llvm/CodeGen/GlobalISel/GenericMachineInstrs.h"
#include "llvm/CodeGen/GlobalISel/MIPatternMatch.h"
#include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/IR/DiagnosticInfo.h"
#include "llvm/IR/IntrinsicsAMDGPU.h"
#include <optional>
#include "AMDGPUGenGlobalISel.inc"

Go to the source code of this file.

Classes

class  SearchOptions
 This is used to control valid status that current MI supports. More...
 

Macros

#define DEBUG_TYPE   "amdgpu-isel"
 
#define GET_GLOBALISEL_IMPL
 
#define AMDGPUSubtarget   GCNSubtarget
 
#define GET_GLOBALISEL_PREDICATES_INIT
 
#define GET_GLOBALISEL_TEMPORARIES_INIT
 

Enumerations

enum class  SrcStatus {
  IS_SAME , IS_UPPER_HALF , IS_LOWER_HALF , IS_UPPER_HALF_NEG ,
  IS_LOWER_HALF_NEG , IS_HI_NEG , IS_LO_NEG , IS_BOTH_NEG ,
  INVALID , NEG_START = IS_UPPER_HALF_NEG , NEG_END = IS_BOTH_NEG , HALF_START = IS_UPPER_HALF ,
  HALF_END = IS_LOWER_HALF_NEG
}
 
enum class  TypeClass { VECTOR_OF_TWO , SCALAR , NONE_OF_LISTED }
 

Functions

static Register getWaveAddress (const MachineInstr *Def)
 
static unsigned getLogicalBitOpcode (unsigned Opc, bool Is64)
 
static int getV_CMPOpcode (CmpInst::Predicate P, unsigned Size, const GCNSubtarget &ST)
 
static bool isLaneMaskFromSameBlock (Register Reg, MachineRegisterInfo &MRI, MachineBasicBlock *MBB)
 
static unsigned gwsIntrinToOpcode (unsigned IntrID)
 
static bool parseTexFail (uint64_t TexFailCtrl, bool &TFE, bool &LWE, bool &IsTexFail)
 
static bool shouldUseAndMask (unsigned Size, unsigned &Mask)
 
static Register stripCopy (Register Reg, MachineRegisterInfo &MRI)
 
static Register stripBitCast (Register Reg, MachineRegisterInfo &MRI)
 
static bool isExtractHiElt (MachineRegisterInfo &MRI, Register In, Register &Out)
 
static bool isConstant (const MachineInstr &MI)
 
static bool isVCmpResult (Register Reg, MachineRegisterInfo &MRI)
 
static std::pair< Register, unsignedcomputeIndirectRegIndex (MachineRegisterInfo &MRI, const SIRegisterInfo &TRI, const TargetRegisterClass *SuperRC, Register IdxReg, unsigned EltSize, GISelValueTracking &ValueTracking)
 Return the register to use for the index value, and the subregister to use for the indirectly accessed register.
 
static std::pair< unsigned, uint8_tBitOp3_Op (Register R, SmallVectorImpl< Register > &Src, const MachineRegisterInfo &MRI)
 
static bool isTruncHalf (const MachineInstr *MI, const MachineRegisterInfo &MRI)
 Test if the MI is truncating to half, such as reg0:n = G_TRUNC reg1:2n
 
static bool isLshrHalf (const MachineInstr *MI, const MachineRegisterInfo &MRI)
 Test if the MI is logic shift right with half bits, such as reg0:2n =G_LSHR reg1:2n, CONST(n)
 
static bool isShlHalf (const MachineInstr *MI, const MachineRegisterInfo &MRI)
 Test if the MI is shift left with half bits, such as reg0:2n =G_SHL reg1:2n, CONST(n)
 
static bool isUnmergeHalf (const MachineInstr *MI, const MachineRegisterInfo &MRI)
 Test function, if the MI is reg0:n, reg1:n = G_UNMERGE_VALUES reg2:2n
 
static TypeClass isVectorOfTwoOrScalar (Register Reg, const MachineRegisterInfo &MRI)
 
static SrcStatus getNegStatus (Register Reg, SrcStatus S, const MachineRegisterInfo &MRI)
 
static std::optional< std::pair< Register, SrcStatus > > calcNextStatus (std::pair< Register, SrcStatus > Curr, const MachineRegisterInfo &MRI)
 
static SmallVector< std::pair< Register, SrcStatus > > getSrcStats (Register Reg, const MachineRegisterInfo &MRI, SearchOptions SO, int MaxDepth=3)
 
static std::pair< Register, SrcStatusgetLastSameOrNeg (Register Reg, const MachineRegisterInfo &MRI, SearchOptions SO, int MaxDepth=3)
 
static bool isSameBitWidth (Register Reg1, Register Reg2, const MachineRegisterInfo &MRI)
 
static unsigned updateMods (SrcStatus HiStat, SrcStatus LoStat, unsigned Mods)
 
static bool isValidToPack (SrcStatus HiStat, SrcStatus LoStat, Register NewReg, Register RootReg, const SIInstrInfo &TII, const MachineRegisterInfo &MRI)
 
static bool checkRB (Register Reg, unsigned int RBNo, const AMDGPURegisterBankInfo &RBI, const MachineRegisterInfo &MRI, const TargetRegisterInfo &TRI)
 
static Register getLegalRegBank (Register NewReg, Register RootReg, const AMDGPURegisterBankInfo &RBI, MachineRegisterInfo &MRI, const TargetRegisterInfo &TRI, const SIInstrInfo &TII)
 
static Register buildRegSequence (SmallVectorImpl< Register > &Elts, MachineInstr *InsertPt, MachineRegisterInfo &MRI)
 
static void selectWMMAModsNegAbs (unsigned ModOpcode, unsigned &Mods, SmallVectorImpl< Register > &Elts, Register &Src, MachineInstr *InsertPt, MachineRegisterInfo &MRI)
 
static bool isNoUnsignedWrap (MachineInstr *Addr)
 
static void addZeroImm (MachineInstrBuilder &MIB)
 
static Register buildRSRC (MachineIRBuilder &B, MachineRegisterInfo &MRI, uint32_t FormatLo, uint32_t FormatHi, Register BasePtr)
 Return a resource descriptor for use with an arbitrary 64-bit pointer.
 
static Register buildAddr64RSrc (MachineIRBuilder &B, MachineRegisterInfo &MRI, const SIInstrInfo &TII, Register BasePtr)
 
static Register buildOffsetSrc (MachineIRBuilder &B, MachineRegisterInfo &MRI, const SIInstrInfo &TII, Register BasePtr)
 
static std::optional< uint64_tgetConstantZext32Val (Register Reg, const MachineRegisterInfo &MRI)
 Get an immediate that must be 32-bits, and treated as zero extended.
 
unsigned getNamedBarrierOp (bool HasInlineConst, Intrinsic::ID IntrID)
 

Detailed Description

This file implements the targeting of the InstructionSelector class for AMDGPU.

Todo:
This should be generated by TableGen.

Definition in file AMDGPUInstructionSelector.cpp.

Macro Definition Documentation

◆ AMDGPUSubtarget

Definition at line 38 of file AMDGPUInstructionSelector.cpp.

◆ DEBUG_TYPE

#define DEBUG_TYPE   "amdgpu-isel"

Definition at line 32 of file AMDGPUInstructionSelector.cpp.

◆ GET_GLOBALISEL_IMPL

#define GET_GLOBALISEL_IMPL

Definition at line 37 of file AMDGPUInstructionSelector.cpp.

◆ GET_GLOBALISEL_PREDICATES_INIT

#define GET_GLOBALISEL_PREDICATES_INIT

◆ GET_GLOBALISEL_TEMPORARIES_INIT

#define GET_GLOBALISEL_TEMPORARIES_INIT

Enumeration Type Documentation

◆ SrcStatus

enum class SrcStatus
strong
Enumerator
IS_SAME 
IS_UPPER_HALF 
IS_LOWER_HALF 
IS_UPPER_HALF_NEG 
IS_LOWER_HALF_NEG 
IS_HI_NEG 
IS_LO_NEG 
IS_BOTH_NEG 
INVALID 
NEG_START 
NEG_END 
HALF_START 
HALF_END 

Definition at line 4379 of file AMDGPUInstructionSelector.cpp.

◆ TypeClass

enum class TypeClass
strong
Enumerator
VECTOR_OF_TWO 
SCALAR 
NONE_OF_LISTED 

Definition at line 4451 of file AMDGPUInstructionSelector.cpp.

Function Documentation

◆ addZeroImm()

static void addZeroImm ( MachineInstrBuilder MIB)
static

◆ BitOp3_Op()

static std::pair< unsigned, uint8_t > BitOp3_Op ( Register  R,
SmallVectorImpl< Register > &  Src,
const MachineRegisterInfo MRI 
)
static

◆ buildAddr64RSrc()

static Register buildAddr64RSrc ( MachineIRBuilder B,
MachineRegisterInfo MRI,
const SIInstrInfo TII,
Register  BasePtr 
)
static

Definition at line 6314 of file AMDGPUInstructionSelector.cpp.

References B, buildRSRC(), llvm::Hi_32(), MRI, and TII.

◆ buildOffsetSrc()

static Register buildOffsetSrc ( MachineIRBuilder B,
MachineRegisterInfo MRI,
const SIInstrInfo TII,
Register  BasePtr 
)
static

Definition at line 6323 of file AMDGPUInstructionSelector.cpp.

References B, buildRSRC(), llvm::Hi_32(), MRI, and TII.

◆ buildRegSequence()

static Register buildRegSequence ( SmallVectorImpl< Register > &  Elts,
MachineInstr InsertPt,
MachineRegisterInfo MRI 
)
static

◆ buildRSRC()

static Register buildRSRC ( MachineIRBuilder B,
MachineRegisterInfo MRI,
uint32_t  FormatLo,
uint32_t  FormatHi,
Register  BasePtr 
)
static

Return a resource descriptor for use with an arbitrary 64-bit pointer.

If BasePtr is not valid, a null base pointer will be used.

Definition at line 6271 of file AMDGPUInstructionSelector.cpp.

References B, and MRI.

Referenced by buildAddr64RSrc(), and buildOffsetSrc().

◆ calcNextStatus()

static std::optional< std::pair< Register, SrcStatus > > calcNextStatus ( std::pair< Register, SrcStatus Curr,
const MachineRegisterInfo MRI 
)
static

◆ checkRB()

static bool checkRB ( Register  Reg,
unsigned int  RBNo,
const AMDGPURegisterBankInfo RBI,
const MachineRegisterInfo MRI,
const TargetRegisterInfo TRI 
)
static

◆ computeIndirectRegIndex()

static std::pair< Register, unsigned > computeIndirectRegIndex ( MachineRegisterInfo MRI,
const SIRegisterInfo TRI,
const TargetRegisterClass SuperRC,
Register  IdxReg,
unsigned  EltSize,
GISelValueTracking ValueTracking 
)
static

Return the register to use for the index value, and the subregister to use for the indirectly accessed register.

Definition at line 3179 of file AMDGPUInstructionSelector.cpp.

References assert(), llvm::AMDGPU::getBaseWithConstantOffset(), MRI, llvm::Offset, llvm::ArrayRef< T >::size(), and TRI.

◆ getConstantZext32Val()

static std::optional< uint64_t > getConstantZext32Val ( Register  Reg,
const MachineRegisterInfo MRI 
)
static

Get an immediate that must be 32-bits, and treated as zero extended.

Definition at line 6544 of file AMDGPUInstructionSelector.cpp.

References llvm::getIConstantVRegSExtVal(), llvm::Lo_32(), and MRI.

◆ getLastSameOrNeg()

static std::pair< Register, SrcStatus > getLastSameOrNeg ( Register  Reg,
const MachineRegisterInfo MRI,
SearchOptions  SO,
int  MaxDepth = 3 
)
static

◆ getLegalRegBank()

static Register getLegalRegBank ( Register  NewReg,
Register  RootReg,
const AMDGPURegisterBankInfo RBI,
MachineRegisterInfo MRI,
const TargetRegisterInfo TRI,
const SIInstrInfo TII 
)
static

◆ getLogicalBitOpcode()

static unsigned getLogicalBitOpcode ( unsigned  Opc,
bool  Is64 
)
static

Definition at line 375 of file AMDGPUInstructionSelector.cpp.

References llvm_unreachable, and Opc.

◆ getNamedBarrierOp()

unsigned getNamedBarrierOp ( bool  HasInlineConst,
Intrinsic::ID  IntrID 
)

Definition at line 6735 of file AMDGPUInstructionSelector.cpp.

References llvm_unreachable.

◆ getNegStatus()

static SrcStatus getNegStatus ( Register  Reg,
SrcStatus  S,
const MachineRegisterInfo MRI 
)
static

Definition at line 4463 of file AMDGPUInstructionSelector.cpp.

References isVectorOfTwoOrScalar(), llvm_unreachable, and MRI.

Referenced by calcNextStatus().

◆ getSrcStats()

static SmallVector< std::pair< Register, SrcStatus > > getSrcStats ( Register  Reg,
const MachineRegisterInfo MRI,
SearchOptions  SO,
int  MaxDepth = 3 
)
static

◆ getV_CMPOpcode()

static int getV_CMPOpcode ( CmpInst::Predicate  P,
unsigned  Size,
const GCNSubtarget ST 
)
static

◆ getWaveAddress()

static Register getWaveAddress ( const MachineInstr Def)
static

Definition at line 71 of file AMDGPUInstructionSelector.cpp.

◆ gwsIntrinToOpcode()

static unsigned gwsIntrinToOpcode ( unsigned  IntrID)
static

Definition at line 1842 of file AMDGPUInstructionSelector.cpp.

References llvm_unreachable.

◆ isConstant()

static bool isConstant ( const MachineInstr MI)
static

◆ isExtractHiElt()

static bool isExtractHiElt ( MachineRegisterInfo MRI,
Register  In,
Register Out 
)
static

◆ isLaneMaskFromSameBlock()

static bool isLaneMaskFromSameBlock ( Register  Reg,
MachineRegisterInfo MRI,
MachineBasicBlock MBB 
)
static

◆ isLshrHalf()

static bool isLshrHalf ( const MachineInstr MI,
const MachineRegisterInfo MRI 
)
static

Test if the MI is logic shift right with half bits, such as reg0:2n =G_LSHR reg1:2n, CONST(n)

Definition at line 4410 of file AMDGPUInstructionSelector.cpp.

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

Referenced by calcNextStatus().

◆ isNoUnsignedWrap()

static bool isNoUnsignedWrap ( MachineInstr Addr)
static

Definition at line 5986 of file AMDGPUInstructionSelector.cpp.

References Addr, and llvm::MachineInstr::NoUWrap.

◆ isSameBitWidth()

static bool isSameBitWidth ( Register  Reg1,
Register  Reg2,
const MachineRegisterInfo MRI 
)
static

Definition at line 4782 of file AMDGPUInstructionSelector.cpp.

References MRI.

Referenced by isValidToPack().

◆ isShlHalf()

static bool isShlHalf ( const MachineInstr MI,
const MachineRegisterInfo MRI 
)
static

Test if the MI is shift left with half bits, such as reg0:2n =G_SHL reg1:2n, CONST(n)

Definition at line 4427 of file AMDGPUInstructionSelector.cpp.

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

Referenced by calcNextStatus().

◆ isTruncHalf()

static bool isTruncHalf ( const MachineInstr MI,
const MachineRegisterInfo MRI 
)
static

Test if the MI is truncating to half, such as reg0:n = G_TRUNC reg1:2n

Definition at line 4398 of file AMDGPUInstructionSelector.cpp.

References MI, and MRI.

Referenced by calcNextStatus().

◆ isUnmergeHalf()

static bool isUnmergeHalf ( const MachineInstr MI,
const MachineRegisterInfo MRI 
)
static

Test function, if the MI is reg0:n, reg1:n = G_UNMERGE_VALUES reg2:2n

Definition at line 4443 of file AMDGPUInstructionSelector.cpp.

References MI.

Referenced by calcNextStatus().

◆ isValidToPack()

static bool isValidToPack ( SrcStatus  HiStat,
SrcStatus  LoStat,
Register  NewReg,
Register  RootReg,
const SIInstrInfo TII,
const MachineRegisterInfo MRI 
)
static

Definition at line 4814 of file AMDGPUInstructionSelector.cpp.

References isSameBitWidth(), and MRI.

◆ isVCmpResult()

static bool isVCmpResult ( Register  Reg,
MachineRegisterInfo MRI 
)
static

Definition at line 2973 of file AMDGPUInstructionSelector.cpp.

References isVCmpResult(), MI, and MRI.

Referenced by isVCmpResult().

◆ isVectorOfTwoOrScalar()

static TypeClass isVectorOfTwoOrScalar ( Register  Reg,
const MachineRegisterInfo MRI 
)
static

◆ parseTexFail()

static bool parseTexFail ( uint64_t  TexFailCtrl,
bool TFE,
bool LWE,
bool IsTexFail 
)
static

Definition at line 1992 of file AMDGPUInstructionSelector.cpp.

◆ selectWMMAModsNegAbs()

static void selectWMMAModsNegAbs ( unsigned  ModOpcode,
unsigned Mods,
SmallVectorImpl< Register > &  Elts,
Register Src,
MachineInstr InsertPt,
MachineRegisterInfo MRI 
)
static

◆ shouldUseAndMask()

static bool shouldUseAndMask ( unsigned  Size,
unsigned Mask 
)
static
Returns
true if a bitmask for Size bits will be an inline immediate.

Definition at line 2538 of file AMDGPUInstructionSelector.cpp.

References Size.

◆ stripBitCast()

static Register stripBitCast ( Register  Reg,
MachineRegisterInfo MRI 
)
static

◆ stripCopy()

static Register stripCopy ( Register  Reg,
MachineRegisterInfo MRI 
)
static

Definition at line 2708 of file AMDGPUInstructionSelector.cpp.

References llvm::getDefSrcRegIgnoringCopies(), and MRI.

Referenced by isExtractHiElt().

◆ updateMods()

static unsigned updateMods ( SrcStatus  HiStat,
SrcStatus  LoStat,
unsigned  Mods 
)
static