Skip to content

Commit

Permalink
[MIR] Teach the parser/printer that generic virtual registers do not …
Browse files Browse the repository at this point in the history
…need a register class.

llvm-svn: 262893
  • Loading branch information
Quentin Colombet committed Mar 8, 2016
1 parent 7e6f09c commit 050b211
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 15 deletions.
19 changes: 13 additions & 6 deletions llvm/lib/CodeGen/MIRParser/MIRParser.cpp
Expand Up @@ -347,12 +347,19 @@ bool MIRParserImpl::initializeRegisterInfo(MachineFunction &MF,
SMDiagnostic Error;
// Parse the virtual register information.
for (const auto &VReg : YamlMF.VirtualRegisters) {
const auto *RC = getRegClass(MF, VReg.Class.Value);
if (!RC)
return error(VReg.Class.SourceRange.Start,
Twine("use of undefined register class '") +
VReg.Class.Value + "'");
unsigned Reg = RegInfo.createVirtualRegister(RC);
unsigned Reg;
if (StringRef(VReg.Class.Value).equals("_")) {
// This is a generic virtual register.
// The size will be set appropriately when we reach the definition.
Reg = RegInfo.createGenericVirtualRegister(/*Size*/ 1);
} else {
const auto *RC = getRegClass(MF, VReg.Class.Value);
if (!RC)
return error(VReg.Class.SourceRange.Start,
Twine("use of undefined register class '") +
VReg.Class.Value + "'");
Reg = RegInfo.createVirtualRegister(RC);
}
if (!PFS.VirtualRegisterSlots.insert(std::make_pair(VReg.ID.Value, Reg))
.second)
return error(VReg.ID.SourceRange.Start,
Expand Down
9 changes: 7 additions & 2 deletions llvm/lib/CodeGen/MIRPrinter.cpp
Expand Up @@ -207,8 +207,13 @@ void MIRPrinter::convert(yaml::MachineFunction &MF,
unsigned Reg = TargetRegisterInfo::index2VirtReg(I);
yaml::VirtualRegisterDefinition VReg;
VReg.ID = I;
VReg.Class =
StringRef(TRI->getRegClassName(RegInfo.getRegClass(Reg))).lower();
if (RegInfo.getRegClass(Reg))
VReg.Class =
StringRef(TRI->getRegClassName(RegInfo.getRegClass(Reg))).lower();
else {
VReg.Class = std::string("_");
assert(RegInfo.getSize(Reg) && "Generic registers must have a size");
}
unsigned PreferredReg = RegInfo.getSimpleHint(Reg);
if (PreferredReg)
printReg(PreferredReg, VReg.PreferredRegister, TRI);
Expand Down
17 changes: 10 additions & 7 deletions llvm/test/CodeGen/MIR/X86/generic-virtual-registers.mir
Expand Up @@ -19,14 +19,17 @@
name: bar
isSSA: true
# CHECK: registers:
# CHECK-NEXT: - { id: 0, class: gr32 }
# CHECK-NEXT: - { id: 1, class: gr64 }
# CHECK-NEXT: - { id: 0, class: _ }
# CHECK-NEXT: - { id: 1, class: _ }
# CHECK-NEXT: - { id: 2, class: _ }
# CHECK-NEXT: - { id: 3, class: _ }
# CHECK-NEXT: - { id: 4, class: _ }
registers:
- { id: 0, class: gr32 }
- { id: 1, class: gr64 }
- { id: 2, class: gr64 }
- { id: 3, class: gr64 }
- { id: 4, class: gr64 }
- { id: 0, class: _ }
- { id: 1, class: _ }
- { id: 2, class: _ }
- { id: 3, class: _ }
- { id: 4, class: _ }
body: |
bb.0.entry:
liveins: %edi
Expand Down

0 comments on commit 050b211

Please sign in to comment.