diff --git a/llvm/include/llvm/CodeGen/MachineRegisterInfo.h b/llvm/include/llvm/CodeGen/MachineRegisterInfo.h --- a/llvm/include/llvm/CodeGen/MachineRegisterInfo.h +++ b/llvm/include/llvm/CodeGen/MachineRegisterInfo.h @@ -137,6 +137,9 @@ /// Map generic virtual registers to their low-level type. VRegToTypeMap VRegToType; + /// Target-specific flags associated with a virtual register. + IndexedMap VRegFlags; + /// Keep track of the physical registers that are live in to the function. /// Live in values are typically arguments in registers. LiveIn values are /// allowed to have virtual registers associated with them, stored in the @@ -755,6 +758,12 @@ /// type \p Ty. Register createGenericVirtualRegister(LLT Ty, StringRef Name = ""); + /// Set \p Flag to \p Reg + void setFlag(Register Reg, uint8_t Flag); + + /// Returns true if \p Flag is set for \p Reg + bool checkFlag(Register Reg, uint8_t Flag) const; + /// Remove all types associated to virtual registers (after instruction /// selection and constraining of all generic virtual registers). void clearVirtRegTypes(); diff --git a/llvm/lib/CodeGen/MachineRegisterInfo.cpp b/llvm/lib/CodeGen/MachineRegisterInfo.cpp --- a/llvm/lib/CodeGen/MachineRegisterInfo.cpp +++ b/llvm/lib/CodeGen/MachineRegisterInfo.cpp @@ -46,6 +46,7 @@ unsigned NumRegs = getTargetRegisterInfo()->getNumRegs(); VRegInfo.reserve(256); RegAllocHints.reserve(256); + VRegFlags.reserve(256); UsedPhysRegMask.resize(NumRegs); PhysRegUseDefLists.reset(new MachineOperand*[NumRegs]()); } @@ -145,6 +146,7 @@ Register Reg = Register::index2VirtReg(getNumVirtRegs()); VRegInfo.grow(Reg); RegAllocHints.grow(Reg); + VRegFlags.grow(Reg); insertVRegByName(Name, Reg); return Reg; } @@ -171,6 +173,7 @@ StringRef Name) { Register Reg = createIncompleteVirtualRegister(Name); VRegInfo[Reg].first = VRegInfo[VReg].first; + VRegFlags[Reg] = VRegFlags[VReg]; setType(Reg, getType(VReg)); if (TheDelegate) TheDelegate->MRI_NoteNewVirtualRegister(Reg); @@ -182,6 +185,19 @@ VRegToType[VReg] = Ty; } +void MachineRegisterInfo::setFlag(Register Reg, uint8_t Flag) { + assert(Register::isVirtualRegister(Reg)); + if (VRegFlags.inBounds(Reg)) + VRegFlags[Reg] |= (uint8_t)1 << Flag; +} + +bool MachineRegisterInfo::checkFlag(Register Reg, uint8_t Flag) const { + if (Register::isVirtualRegister(Reg)) + return VRegFlags.inBounds(Reg) && VRegFlags[Reg] & ((uint8_t)1 << Flag); + + return false; +} + Register MachineRegisterInfo::createGenericVirtualRegister(LLT Ty, StringRef Name) { // New virtual register number.