39#define DEBUG_TYPE "M68k-instr-info"
41#define GET_INSTRINFO_CTOR_DTOR
42#include "M68kGenInstrInfo.inc"
45void M68kInstrInfo::anchor() {}
91 bool AllowModify)
const {
94 std::pair<MachineBasicBlock::reverse_iterator, MachineBasicBlock *>{
98 std::vector<std::reference_wrapper<llvm::MachineInstr>> EraseList;
100 for (
auto &
Ref : EraseList)
101 Ref.get().eraseFromParent();
106 for (
auto iter =
MBB.rbegin(); iter !=
MBB.rend(); iter = std::next(iter)) {
108 unsigned Opcode = iter->getOpcode();
110 if (iter->isDebugInstr())
115 if (!isUnpredicatedTerminator(*iter))
120 if (!iter->isBranch())
124 if (Opcode == M68k::BRA8 || Opcode == M68k::BRA16) {
125 if (!iter->getOperand(0).isMBB())
127 UncondBranch = {iter, iter->getOperand(0).getMBB()};
130 TBB = UncondBranch.second;
136 EraseList.insert(EraseList.begin(),
MBB.rbegin(), iter);
142 if (
MBB.isLayoutSuccessor(UncondBranch.second)) {
144 EraseList.push_back(*iter);
145 UncondBranch = {
MBB.rend(),
nullptr};
166 if (!iter->getOperand(0).isMBB())
178 if (UncondBranch.first !=
MBB.rend()) {
180 assert(std::next(UncondBranch.first) == iter &&
"Wrong block layout.");
199 if (AllowModify &&
MBB.isLayoutSuccessor(CondBranchTarget)) {
205 .
addMBB(UncondBranch.second);
207 EraseList.push_back(*iter);
208 EraseList.push_back(*UncondBranch.first);
210 TBB = UncondBranch.second;
216 TBB = CondBranchTarget;
217 FBB = UncondBranch.second;
221 UncondBranch = {
MBB.rend(),
nullptr};
225 TBB = CondBranchTarget;
240 if (!iter->getOperand(0).isMBB())
242 auto NewTBB = iter->getOperand(0).getMBB();
243 if (OldBranchCode == BranchCode &&
TBB == NewTBB)
257 bool AllowModify)
const {
262 int *BytesRemoved)
const {
263 assert(!BytesRemoved &&
"code size not handled");
268 while (
I !=
MBB.begin()) {
270 if (
I->isDebugValue())
272 if (
I->getOpcode() != M68k::BRA8 &&
276 I->eraseFromParent();
288 assert(
TBB &&
"InsertBranch must not be told to insert a fallthrough");
290 "M68k branch conditions have one component!");
291 assert(!BytesAdded &&
"code size not handled");
295 assert(!FBB &&
"Unconditional branch with multiple successors!");
301 bool FallThru = FBB ==
nullptr;
319 unsigned Reg,
MVT From,
MVT To)
const {
320 if (From == MVT::i8) {
323 if (To == MVT::i32) {
324 R =
RI.getSubReg(Reg, M68k::MxSubRegIndex16Lo);
325 assert(R &&
"No viable SUB register available");
336 unsigned Reg,
MVT From,
MVT To)
const {
340 if (!
Subtarget.atLeastM68020() && From == MVT::i16 && To == MVT::i32 &&
341 M68k::DR32RegClass.contains(Reg)) {
342 unsigned SubReg =
RI.getSubReg(Reg, M68k::MxSubRegIndex16Lo);
370 const auto *DR32 =
RI.getRegClass(M68k::DR32RegClassID);
371 const auto *AR32 =
RI.getRegClass(M68k::AR32RegClassID);
372 const auto *AR16 =
RI.getRegClass(M68k::AR16RegClassID);
373 bool IsAddressReg = AR16->contains(Reg) || AR32->contains(Reg);
382 :
Register(
RI.getMatchingMegaReg(Reg, IsAddressReg ? AR32 : DR32));
383 assert(SReg &&
"No viable MEGA register available");
391 MIB->removeFromParent();
394 }
else if (MVTSize == MVT::i8 ||
395 (!IsAddressReg &&
Imm >= -128 &&
Imm <= 127)) {
406 unsigned SubReg =
RI.getSubReg(Reg, M68k::MxSubRegIndex8Lo);
407 assert(SubReg &&
"No viable SUB register available");
422 unsigned SubReg =
RI.getSubReg(Reg, M68k::MxSubRegIndex16Lo);
423 assert(SubReg &&
"No viable SUB register available");
431 MIB->
setDesc(
get(MVTSize == MVT::i16 ? M68k::MOV16ri : M68k::MOV32ri));
439 unsigned Move = MVTDst == MVT::i16 ? M68k::MOV16rr : M68k::MOV32rr;
443 assert(Dst != Src &&
"You cannot use the same Regs with MOVX_RR");
447 const auto *RCDst =
TRI.getMaximalPhysRegClass(Dst, MVTDst);
448 const auto *RCSrc =
TRI.getMaximalPhysRegClass(Src, MVTSrc);
450 assert(RCDst && RCSrc &&
"Wrong use of MOVX_RR");
451 assert(RCDst != RCSrc &&
"You cannot use the same Reg Classes with MOVX_RR");
455 unsigned SSrc =
RI.getMatchingMegaReg(Src, RCDst);
456 assert(SSrc &&
"No viable MEGA register available");
475 MVT MVTDst,
MVT MVTSrc)
const {
481 assert(Dst != Src &&
"You cannot use the same Regs with MOVSX_RR");
485 const auto *RCDst =
TRI.getMaximalPhysRegClass(Dst, MVTDst);
486 const auto *RCSrc =
TRI.getMaximalPhysRegClass(Src, MVTSrc);
488 assert(RCDst && RCSrc &&
"Wrong use of MOVSX_RR");
489 assert(RCDst != RCSrc &&
"You cannot use the same Reg Classes with MOVSX_RR");
493 unsigned SSrc =
RI.getMatchingMegaReg(Src, RCDst);
494 assert(SSrc &&
"No viable MEGA register available");
501 if (Dst != SSrc && !IsSigned) {
506 if (MVTSrc == MVT::i8) {
507 unsigned SubDst =
RI.getSubReg(Dst, M68k::MxSubRegIndex8Lo);
510 unsigned SubDst =
RI.getSubReg(Dst, M68k::MxSubRegIndex16Lo);
516 if (MVTDst == MVT::i16)
517 Move = M68k::MOV16dd;
519 Move = M68k::MOV32dd;
553 RI.getSubReg(Dst, MVTSrc == MVT::i8 ? M68k::MxSubRegIndex8Lo
554 : M68k::MxSubRegIndex16Lo);
555 assert(SubDst &&
"No viable SUB register available");
619 unsigned Mask = 1 <<
RI.getSpillRegisterOrder(Reg);
644 bool AllowSideEffects)
const {
646 if (M68k::AR32RegClass.
contains(Reg)) {
653 if (M68k::DR8RegClass.
contains(Reg))
655 else if (M68k::DR16RegClass.
contains(Reg))
657 else if (M68k::DR32RegClass.
contains(Reg))
661 "buildClearRegister is not implemented for " +
RI.getRegAsmName(Reg));
673 assert(
Desc.getNumOperands() == 3 &&
"Expected two-addr instruction.");
688 switch (
MI.getOpcode()) {
703 case M68k::SETCS_C8d:
705 case M68k::SETCS_C16d:
707 case M68k::SETCS_C32d:
721 const unsigned NameIndices = M68kInstrNameIndices[
MI->getOpcode()];
722 StringRef InstrName(&M68kInstrNameData[NameIndices]);
728 return Regex(
"[A-Z]+(8|16|32)k[a-z](_TC)?$").
match(InstrName);
732 if (OperandNo ==
MI->getNumExplicitOperands() - 1)
733 return Regex(
"[A-Z]+(8|16|32)[a-z]k(_TC)?$").
match(InstrName);
742 bool RenamableDest,
bool RenamableSrc)
const {
748 if (M68k::XR32RegClass.
contains(DstReg, SrcReg)) {
750 }
else if (M68k::XR16RegClass.
contains(DstReg, SrcReg)) {
752 }
else if (M68k::DR8RegClass.
contains(DstReg, SrcReg)) {
760 else if (M68k::DR8RegClass.
contains(SrcReg) &&
761 M68k::XR16RegClass.
contains(DstReg)) {
762 Opc = M68k::MOVXd16d8;
764 }
else if (M68k::DR8RegClass.
contains(SrcReg) &&
765 M68k::XR32RegClass.
contains(DstReg)) {
766 Opc = M68k::MOVXd32d8;
768 }
else if (M68k::XR16RegClass.
contains(SrcReg) &&
769 M68k::XR32RegClass.
contains(DstReg)) {
770 Opc = M68k::MOVXd32d16;
776 else if (SrcReg == M68k::CCR) {
777 if (M68k::DR8RegClass.
contains(DstReg) ||
778 M68k::DR16RegClass.
contains(DstReg) ||
779 M68k::DR32RegClass.
contains(DstReg)) {
780 Opc = STI.
isM68000() ? M68k::MOV16ds : M68k::MOV16dc;
788 else if (DstReg == M68k::CCR) {
789 if (M68k::DR8RegClass.
contains(SrcReg) ||
790 M68k::DR16RegClass.
contains(SrcReg) ||
791 M68k::DR32RegClass.
contains(SrcReg)) {
800 else if (SrcReg == M68k::SR || DstReg == M68k::SR)
806 <<
RI.getName(DstReg) <<
'\n');
823 unsigned CCRSrcReg = STI.
isM68000() ? M68k::SR : M68k::CCR;
829 auto InstUpToI =
MBB.end();
830 while (InstUpToI !=
MI) {
834 if (SrcReg == M68k::CCR) {
838 if (DstReg == M68k::CCR) {
856 RI.getAllocatableSet(MF,
RI.getRegClass(M68k::DR16RegClassID));
858 if (!
RI.regsOverlap(DstReg, Reg) && (UsedRegs.
available(Reg))) {
859 unsigned CCRPushOp = STI.
isM68000() ? M68k::MOV16ds : M68k::MOV16dc;
860 unsigned CCRPopOp = M68k::MOV16cd;
869 unsigned CCRPushOp = STI.
isM68000() ? M68k::MOV16es : M68k::MOV16ec;
870 unsigned CCRPopOp = M68k::MOV16co;
885 switch (
TRI->getSpillSize(*RC)) {
888 dbgs() <<
"Cannot determine appropriate opcode for load/store to/from "
889 <<
TRI->getName(Reg) <<
" of class " <<
TRI->getRegClassName(RC)
890 <<
" with spill size " <<
TRI->getSpillSize(*RC) <<
'\n');
893 if (M68k::XR16RegClass.hasSubClassEq(RC))
894 return load ? M68k::MOVM16mp_P : M68k::MOVM16pm_P;
895 if (M68k::DR8RegClass.hasSubClassEq(RC))
896 return load ? M68k::MOVM8mp_P : M68k::MOVM8pm_P;
897 if (M68k::CCRCRegClass.hasSubClassEq(RC))
898 return load ? M68k::MOVM16mp_P : M68k::MOVM16pm_P;
901 if (M68k::XR32RegClass.hasSubClassEq(RC))
902 return load ? M68k::MOVM32mp_P : M68k::MOVM32pm_P;
921 unsigned SubIdx,
unsigned &
Size,
936 "Stack slot is too small to store");
954 "Stack slot is too small to load");
970 if (GlobalBaseReg != 0)
971 return GlobalBaseReg;
983 GlobalBaseReg = RegInfo.createVirtualRegister(&M68k::AR32_NOSPRegClass);
985 return GlobalBaseReg;
988std::pair<unsigned, unsigned>
990 return std::make_pair(TF, 0u);
996 static const std::pair<unsigned, const char *> TargetFlags[] = {
997 {MO_ABSOLUTE_ADDRESS,
"m68k-absolute"},
998 {MO_PC_RELATIVE_ADDRESS,
"m68k-pcrel"},
999 {MO_GOT,
"m68k-got"},
1000 {MO_GOTOFF,
"m68k-gotoff"},
1001 {MO_GOTPCREL,
"m68k-gotpcrel"},
1002 {MO_PLT,
"m68k-plt"},
1003 {MO_TLSGD,
"m68k-tlsgd"},
1004 {MO_TLSLD,
"m68k-tlsld"},
1005 {MO_TLSLDM,
"m68k-tlsldm"},
1006 {MO_TLSIE,
"m68k-tlsie"},
1007 {MO_TLSLE,
"m68k-tlsle"}};
1012#define DEBUG_TYPE "m68k-create-global-base-reg"
1014#define PASS_NAME "M68k PIC Global Base Reg Initialization"
1026 unsigned GlobalBaseReg = MxFI->getGlobalBaseReg();
1029 if (GlobalBaseReg == 0)
1050char M68kGlobalBaseReg::ID = 0;
1056 return new M68kGlobalBaseReg();
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU Mark last scratch load
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
const HexagonInstrInfo * TII
This file implements the LivePhysRegs utility for tracking liveness of physical registers.
This file exposes functions that may be used with BuildMI from the MachineInstrBuilder....
static M68k::CondCode getCondFromBranchOpc(unsigned BrOpc)
static bool Expand2AddrUndef(MachineInstrBuilder &MIB, const MCInstrDesc &Desc)
Expand a single-def pseudo instruction to a two-addr instruction with two undef reads of the register...
This file contains the M68k implementation of the TargetInstrInfo class.
This file contains the declarations for the code emitter which are useful outside of the emitter itse...
This file provides M68k specific target descriptions.
This file declares the M68k specific subclass of MachineFunctionInfo.
This file contains the M68k implementation of the TargetRegisterInfo class.
This file declares the M68k specific subclass of TargetMachine.
Register const TargetRegisterInfo * TRI
Promote Memory to Register
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
This file defines the scope_exit class, which executes user-defined cleanup logic at scope exit.
static SPCC::CondCodes GetOppositeBranchCondition(SPCC::CondCodes CC)
static unsigned getStoreRegOpcode(Register SrcReg, const TargetRegisterClass *RC, bool IsStackAligned, const X86Subtarget &STI)
static unsigned getLoadRegOpcode(Register DestReg, const TargetRegisterClass *RC, bool IsStackAligned, const X86Subtarget &STI)
static unsigned getLoadStoreRegOpcode(Register Reg, const TargetRegisterClass *RC, bool IsStackAligned, const X86Subtarget &STI, bool Load)
static unsigned GetCondBranchFromCond(XCore::CondCode CC)
GetCondBranchFromCond - Return the Branch instruction opcode that matches the cc.
Represent the analysis usage information of a pass.
LLVM_ABI void setPreservesCFG()
This function should be called by the pass, iff they do not:
Represent a constant reference to an array (0 or more elements consecutively in memory),...
iterator_range< const_set_bits_iterator > set_bits() const
FunctionPass class - This class is used to implement most global optimizations.
A set of register units used to track register liveness.
bool available(MCRegister Reg) const
Returns true if no part of physical register Reg is live.
LLVM_ABI void stepBackward(const MachineInstr &MI)
Updates liveness when stepping backwards over the instruction MI.
LLVM_ABI void addLiveOuts(const MachineBasicBlock &MBB)
Adds registers living out of block MBB.
unsigned getGlobalBaseReg(MachineFunction *MF) const
Return a virtual register initialized with the global base register value.
const M68kSubtarget & Subtarget
bool ExpandMOVI(MachineInstrBuilder &MIB, MVT MVTSize) const
Move immediate to register.
bool ExpandMOVSZX_RR(MachineInstrBuilder &MIB, bool IsSigned, MVT MVTDst, MVT MVTSrc) const
Move from register and extend.
void buildClearRegister(Register Reg, MachineBasicBlock &MBB, MachineBasicBlock::iterator Iter, DebugLoc &DL, bool AllowSideEffects=true) const override
const M68kRegisterInfo & getRegisterInfo() const
TargetInstrInfo is a superset of MRegister info.
const M68kRegisterInfo RI
bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify) const override
ArrayRef< std::pair< unsigned, const char * > > getSerializableDirectMachineOperandTargetFlags() const override
bool expandPostRAPseudo(MachineInstr &MI) const override
unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, ArrayRef< MachineOperand > Cond, const DebugLoc &DL, int *BytesAdded=nullptr) const override
void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, const DebugLoc &DL, Register DestReg, Register SrcReg, bool KillSrc, bool RenamableDest=false, bool RenamableSrc=false) const override
std::pair< unsigned, unsigned > decomposeMachineOperandsTargetFlags(unsigned TF) const override
bool AnalyzeBranchImpl(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify) const
bool isPCRelRegisterOperandLegal(const MachineOperand &MO) const override
bool ExpandMOVX_RR(MachineInstrBuilder &MIB, MVT MVTDst, MVT MVTSrc) const
Move across register classes without extension.
void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, Register SrcReg, bool IsKill, int FrameIndex, const TargetRegisterClass *RC, Register VReg, MachineInstr::MIFlag Flags=MachineInstr::NoFlags) const override
void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, Register DestReg, int FrameIndex, const TargetRegisterClass *RC, Register VReg, unsigned SubReg=0, MachineInstr::MIFlag Flags=MachineInstr::NoFlags) const override
bool ExpandMOVEM(MachineInstrBuilder &MIB, const MCInstrDesc &Desc, bool IsRM) const
Expand all MOVEM pseudos into real MOVEMs.
unsigned removeBranch(MachineBasicBlock &MBB, int *BytesRemoved=nullptr) const override
bool ExpandPUSH_POP(MachineInstrBuilder &MIB, const MCInstrDesc &Desc, bool IsPush) const
Push/Pop to/from stack.
M68kInstrInfo(const M68kSubtarget &STI)
void AddZExt(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, DebugLoc DL, unsigned Reg, MVT From, MVT To) const
Add appropriate ZExt nodes.
bool ExpandMOVSZX_RM(MachineInstrBuilder &MIB, bool IsSigned, const MCInstrDesc &Desc, MVT MVTDst, MVT MVTSrc) const
Move from memory and extend.
bool getStackSlotRange(const TargetRegisterClass *RC, unsigned SubIdx, unsigned &Size, unsigned &Offset, const MachineFunction &MF) const override
void AddSExt(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, DebugLoc DL, unsigned Reg, MVT From, MVT To) const
Add appropriate SExt nodes.
void setGlobalBaseReg(unsigned Reg)
unsigned getGlobalBaseReg() const
const M68kInstrInfo * getInstrInfo() const override
Describe properties that are true of each instruction in the target description file.
LLVM_ABI DebugLoc findDebugLoc(instr_iterator MBBI)
Find the next valid DebugLoc starting at MBBI, skipping any debug instructions.
MachineInstrBundleIterator< MachineInstr > iterator
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
const MachineBasicBlock & front() const
const MachineInstrBuilder & addExternalSymbol(const char *FnName, unsigned TargetFlags=0) const
const MachineInstrBuilder & addReg(Register RegNo, RegState Flags={}, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
const MachineInstrBuilder & add(const MachineOperand &MO) const
const MachineInstrBuilder & addMBB(MachineBasicBlock *MBB, unsigned TargetFlags=0) const
const MachineInstrBuilder & copyImplicitOps(const MachineInstr &OtherMI) const
Copy all the implicit operands from OtherMI onto this one.
MachineInstr * getInstr() const
If conversion operators fail, use this method to get the MachineInstr explicitly.
Representation of each machine instruction.
LLVM_ABI MachineInstr * removeFromParent()
Unlink 'this' from the containing basic block, and return it without deleting it.
const MachineBasicBlock * getParent() const
bool readsRegister(Register Reg, const TargetRegisterInfo *TRI) const
Return true if the MachineInstr reads the specified register.
LLVM_ABI void setDesc(const MCInstrDesc &TID)
Replace the instruction descriptor (thus opcode) of the current instruction with a new one.
const DebugLoc & getDebugLoc() const
Returns the debug location id of this MachineInstr.
const MachineOperand & getOperand(unsigned i) const
LLVM_ABI MachineInstrBundleIterator< MachineInstr > eraseFromParent()
Unlink 'this' from the containing basic block and delete it.
MachineOperand class - Representation of each machine instruction operand.
LLVM_ABI unsigned getOperandNo() const
Returns the index of this operand in the instruction that it belongs to.
bool isReg() const
isReg - Tests if this is a MO_Register operand.
LLVM_ABI void setReg(Register Reg)
Change the register this operand corresponds to.
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
static MachineOperand CreateImm(int64_t Val)
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
LLVM_ABI bool match(StringRef String, SmallVectorImpl< StringRef > *Matches=nullptr, std::string *Error=nullptr) const
matches - Match the regex against a given String.
Wrapper class representing virtual and physical registers.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Represent a constant reference to a string, i.e.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
This namespace holds all of the target specific flags that instruction info tracks.
@ MO_GOTPCREL
On a symbol operand this indicates that the immediate is offset to the GOT entry for the symbol name ...
Define some predicates that are used for node matching.
static const MachineInstrBuilder & addFrameReference(const MachineInstrBuilder &MIB, int FI, int Offset=0)
addFrameReference - This function is used to add a reference to the base of an abstract object on the...
static M68k::CondCode GetCondFromBranchOpc(unsigned Opcode)
This is an optimization pass for GlobalISel generic memory operations.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
@ Implicit
Not emitted register (e.g. carry, or temporary result).
@ Undef
Value of the register doesn't matter.
constexpr RegState getKillRegState(bool B)
LLVM_ABI void reportFatalInternalError(Error Err)
Report a fatal error that indicates a bug in LLVM.
FunctionPass * createM68kGlobalBaseRegPass()
This pass initializes a global base register for PIC on M68k.
MachineInstr * getImm(const MachineOperand &MO, const MachineRegisterInfo *MRI)
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
@ Ref
The access may reference the value stored in memory.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
ArrayRef(const T &OneElt) -> ArrayRef< T >
MCRegisterClass TargetRegisterClass