Update physreg live intervals during remat.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@184574 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Andrew Trick 2013-06-21 18:33:26 +00:00
parent c6bae79adb
commit c12c880998
2 changed files with 32 additions and 4 deletions

View File

@ -1054,6 +1054,34 @@ foldMemoryOperand(ArrayRef<std::pair<MachineInstr*, unsigned> > Ops,
: TII.foldMemoryOperand(MI, FoldOps, StackSlot);
if (!FoldMI)
return false;
// Remove LIS for any dead defs in the original MI not in FoldMI.
for (MIBundleOperands MO(MI); MO.isValid(); ++MO) {
if (!MO->isReg())
continue;
unsigned Reg = MO->getReg();
if (!Reg || TargetRegisterInfo::isVirtualRegister(Reg) ||
MRI.isReserved(Reg)) {
continue;
}
MIBundleOperands::PhysRegInfo RI =
MIBundleOperands(FoldMI).analyzePhysReg(Reg, &TRI);
if (MO->readsReg()) {
assert(RI.Reads && "Cannot fold physreg reader");
continue;
}
if (RI.Defines)
continue;
// FoldMI does not define this physreg. Remove the LI segment.
assert(MO->isDead() && "Cannot fold physreg def");
for (MCRegUnitIterator Units(Reg, &TRI); Units.isValid(); ++Units) {
if (LiveInterval *LI = LIS.getCachedRegUnit(*Units)) {
SlotIndex Idx = LIS.getInstructionIndex(MI).getRegSlot();
if (VNInfo *VNI = LI->getVNInfoAt(Idx))
LI->removeValNo(VNI);
}
}
}
LIS.ReplaceMachineInstrInMaps(MI, FoldMI);
MI->eraseFromParent();

View File

@ -1,5 +1,5 @@
; RUN: llc -march=x86 < %s -verify-machineinstrs
; RUN: llc -march=x86-64 < %s -verify-machineinstrs
; RUN: llc -march=x86 < %s -verify-machineinstrs -precompute-phys-liveness
; RUN: llc -march=x86-64 < %s -verify-machineinstrs -precompute-phys-liveness
; PR6497
@ -107,8 +107,8 @@ do.body92: ; preds = %if.then66
ret void
}
!0 = metadata !{i32 633550}
!1 = metadata !{i32 634261}
!0 = metadata !{i32 633550}
!1 = metadata !{i32 634261}
; Crash during XOR optimization.