mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-27 05:30:49 +00:00
Remove an assertion to fix PR9872.
It can happen that a live debug variable is the last use of a sub-register, and the register allocator will pick a larger register class for the virtual register. If the allocated register doesn't support the sub-register index, just use %noreg for the debug variables instead of asserting. In PR9872, a debug variable ends up in the sub_8bit_hi part of a GR32_ABCD register. The register is split and one part is inflated to GR32 and assigned %ESI because there are no more normal uses of sub_8bit_hi. Since %ESI doesn't have that sub-register, substPhysReg asserted. Now it will simply insert a %noreg instead, and the debug variable will be marked unavailable in that range. We don't currently have a way of saying: !"value" is in bits 8-15 of %ESI, I don't know if DWARF even supports that. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@131073 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f51190b697
commit
cf724f0786
@ -840,6 +840,9 @@ UserValue::rewriteLocations(VirtRegMap &VRM, const TargetRegisterInfo &TRI) {
|
||||
unsigned VirtReg = Loc.getReg();
|
||||
if (VRM.isAssignedReg(VirtReg) &&
|
||||
TargetRegisterInfo::isPhysicalRegister(VRM.getPhys(VirtReg))) {
|
||||
// This can create a %noreg operand in rare cases when the sub-register
|
||||
// index is no longer available. That means the user value is in a
|
||||
// non-existent sub-register, and %noreg is exactly what we want.
|
||||
Loc.substPhysReg(VRM.getPhys(VirtReg), TRI);
|
||||
} else if (VRM.getStackSlot(VirtReg) != VirtRegMap::NO_STACK_SLOT &&
|
||||
VRM.isSpillSlotUsed(VRM.getStackSlot(VirtReg))) {
|
||||
@ -942,6 +945,7 @@ void LDVImpl::emitDebugValues(VirtRegMap *VRM) {
|
||||
DEBUG(dbgs() << "********** EMITTING LIVE DEBUG VARIABLES **********\n");
|
||||
const TargetInstrInfo *TII = MF->getTarget().getInstrInfo();
|
||||
for (unsigned i = 0, e = userValues.size(); i != e; ++i) {
|
||||
DEBUG(userValues[i]->print(dbgs(), &MF->getTarget()));
|
||||
userValues[i]->rewriteLocations(*VRM, *TRI);
|
||||
userValues[i]->emitDebugValues(VRM, *LIS, *TII);
|
||||
}
|
||||
|
@ -125,7 +125,8 @@ void MachineOperand::substPhysReg(unsigned Reg, const TargetRegisterInfo &TRI) {
|
||||
assert(TargetRegisterInfo::isPhysicalRegister(Reg));
|
||||
if (getSubReg()) {
|
||||
Reg = TRI.getSubReg(Reg, getSubReg());
|
||||
assert(Reg && "Invalid SubReg for physical register");
|
||||
// Note that getSubReg() may return 0 if the sub-register doesn't exist.
|
||||
// That won't happen in legal code.
|
||||
setSubReg(0);
|
||||
}
|
||||
setReg(Reg);
|
||||
|
Loading…
Reference in New Issue
Block a user