[llvm] r260474 - [GlobalISel][MachineRegisterInfo] Add a method to create generic vregs.
Quentin Colombet via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 10 16:19:18 PST 2016
Author: qcolombet
Date: Wed Feb 10 18:19:17 2016
New Revision: 260474
URL: http://llvm.org/viewvc/llvm-project?rev=260474&view=rev
Log:
[GlobalISel][MachineRegisterInfo] Add a method to create generic vregs.
For now, generic virtual registers will not have a register class. We may want
to change that. For instance, if we want to use all the methods from
TargetRegisterInfo with generic virtual registers, we need to either have some
sort of generic register classes that do what we want, or teach those methods
how to deal with nullptr register class.
Although the latter seems easy enough to do, we may still want to differenciate
generic register classes from nullptr to catch cases where nullptr gets
introduced by a bug of some sort.
Anyway, I will file a PR to keep track of that.
Modified:
llvm/trunk/include/llvm/CodeGen/MachineRegisterInfo.h
llvm/trunk/lib/CodeGen/MachineInstr.cpp
llvm/trunk/lib/CodeGen/MachineRegisterInfo.cpp
Modified: llvm/trunk/include/llvm/CodeGen/MachineRegisterInfo.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/MachineRegisterInfo.h?rev=260474&r1=260473&r2=260474&view=diff
==============================================================================
--- llvm/trunk/include/llvm/CodeGen/MachineRegisterInfo.h (original)
+++ llvm/trunk/include/llvm/CodeGen/MachineRegisterInfo.h Wed Feb 10 18:19:17 2016
@@ -596,6 +596,10 @@ public:
/// Get the size of \p VReg or 0 if VReg is not a generic
/// (target independent) virtual register.
unsigned getSize(unsigned VReg) const;
+
+ /// Create and return a new generic virtual register with a size of \p Size.
+ /// \pre Size > 0.
+ unsigned createGenericVirtualRegister(unsigned Size);
#endif
/// getNumVirtRegs - Return the number of virtual registers created.
Modified: llvm/trunk/lib/CodeGen/MachineInstr.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineInstr.cpp?rev=260474&r1=260473&r2=260474&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/MachineInstr.cpp (original)
+++ llvm/trunk/lib/CodeGen/MachineInstr.cpp Wed Feb 10 18:19:17 2016
@@ -1838,6 +1838,11 @@ void MachineInstr::print(raw_ostream &OS
}
for (unsigned i = 0; i != VirtRegs.size(); ++i) {
const TargetRegisterClass *RC = MRI->getRegClass(VirtRegs[i]);
+#ifdef LLVM_BUILD_GLOBAL_ISEL
+ // Generic virtual registers do not have register classes.
+ if (!RC)
+ continue;
+#endif
OS << " " << TRI->getRegClassName(RC)
<< ':' << PrintReg(VirtRegs[i]);
for (unsigned j = i+1; j != VirtRegs.size();) {
Modified: llvm/trunk/lib/CodeGen/MachineRegisterInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineRegisterInfo.cpp?rev=260474&r1=260473&r2=260474&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/MachineRegisterInfo.cpp (original)
+++ llvm/trunk/lib/CodeGen/MachineRegisterInfo.cpp Wed Feb 10 18:19:17 2016
@@ -110,6 +110,22 @@ MachineRegisterInfo::getSize(unsigned VR
VRegToSize.find(VReg);
return SizeIt != VRegToSize.end()? SizeIt->second: 0;
}
+
+unsigned
+MachineRegisterInfo::createGenericVirtualRegister(unsigned Size) {
+ assert(Size && "Cannot create empty virtual register");
+
+ // New virtual register number.
+ unsigned Reg = TargetRegisterInfo::index2VirtReg(getNumVirtRegs());
+ VRegInfo.grow(Reg);
+ // FIXME: Should we use a dummy register class?
+ VRegInfo[Reg].first = nullptr;
+ VRegToSize[Reg] = Size;
+ RegAllocHints.grow(Reg);
+ if (TheDelegate)
+ TheDelegate->MRI_NoteNewVirtualRegister(Reg);
+ return Reg;
+}
#endif // LLVM_BUILD_GLOBAL_ISEL
/// clearVirtRegs - Remove all virtual registers (after physreg assignment).
More information about the llvm-commits
mailing list