Skip to content

Commit 0f4446b

Browse files
committed
[MIR-Canon] Add support for rewriting VRegs that are typed but don't have an RC.
There were crashes (addrspace-memoperands.mir was only one of them) in MIR that had operands that came from before register classes were set. With these operands, creating a replacement vreg (for MIR-Canon's renaming) needs to use the vreg type rather than the RegisterClass which is not present. Differential Revision: https://reviews.llvm.org/D62543 llvm-svn: 362122
1 parent 50daaa5 commit 0f4446b

File tree

2 files changed

+7
-5
lines changed

2 files changed

+7
-5
lines changed

llvm/lib/CodeGen/MIRCanonicalizerPass.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -500,14 +500,15 @@ class NamedVRegCursor {
500500
return virtualVRegNumber;
501501
}
502502

503-
unsigned createVirtualRegister(const TargetRegisterClass *RC) {
503+
unsigned createVirtualRegister(unsigned VReg) {
504504
std::string S;
505505
raw_string_ostream OS(S);
506506
OS << "namedVReg" << (virtualVRegNumber & ~0x80000000);
507507
OS.flush();
508508
virtualVRegNumber++;
509-
510-
return MRI.createVirtualRegister(RC, OS.str());
509+
if (auto RC = MRI.getRegClassOrNull(VReg))
510+
return MRI.createVirtualRegister(RC, OS.str());
511+
return MRI.createGenericVirtualRegister(MRI.getType(VReg), OS.str());
511512
}
512513
};
513514
} // namespace
@@ -557,7 +558,7 @@ GetVRegRenameMap(const std::vector<TypedVReg> &VRegs,
557558
continue;
558559
}
559560

560-
auto Rename = NVC.createVirtualRegister(MRI.getRegClass(Reg));
561+
auto Rename = NVC.createVirtualRegister(Reg);
561562

562563
if (VRegRenameMap.find(Reg) == VRegRenameMap.end()) {
563564
LLVM_DEBUG(dbgs() << "Mapping vreg ";);
@@ -741,7 +742,7 @@ static bool runOnBasicBlock(MachineBasicBlock *MBB,
741742
MachineInstr &MI = *MII++;
742743
Changed = true;
743744
unsigned vRegToRename = MI.getOperand(0).getReg();
744-
auto Rename = NVC.createVirtualRegister(MRI.getRegClass(vRegToRename));
745+
auto Rename = NVC.createVirtualRegister(vRegToRename);
745746

746747
std::vector<MachineOperand *> RenameMOs;
747748
for (auto &MO : MRI.reg_operands(vRegToRename)) {

llvm/test/CodeGen/MIR/AArch64/addrspace-memoperands.mir

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# RUN: llc -mtriple=aarch64-none-linux-gnu -run-pass none -o - %s | FileCheck %s
2+
# RUN: llc -mtriple=aarch64-none-linux-gnu -run-pass mir-canonicalizer -o - %s
23

34
--- |
45

0 commit comments

Comments
 (0)