Skip to content

Commit c1988f3

Browse files
committed
LiveIntervalAnalysis: Mark subregister defs as undef when we determined they are only reading a dead superregister value
This was not necessary before as this case can only be detected when the liveness analysis is at subregister level. llvm-svn: 226733
1 parent 4b6a7e3 commit c1988f3

File tree

3 files changed

+29
-5
lines changed

3 files changed

+29
-5
lines changed

llvm/include/llvm/CodeGen/MachineInstr.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1048,6 +1048,11 @@ class MachineInstr : public ilist_node<MachineInstr> {
10481048
bool addRegisterDead(unsigned Reg, const TargetRegisterInfo *RegInfo,
10491049
bool AddIfNotFound = false);
10501050

1051+
/// Mark all subregister defs of register @p Reg with the undef flag.
1052+
/// This function is used when we determined to have a subregister def in an
1053+
/// otherwise undefined super register.
1054+
void addRegisterDefReadUndef(unsigned Reg);
1055+
10511056
/// addRegisterDefined - We have determined MI defines a register. Make sure
10521057
/// there is an operand defining Reg.
10531058
void addRegisterDefined(unsigned Reg,

llvm/lib/CodeGen/LiveIntervalAnalysis.cpp

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -448,23 +448,34 @@ bool LiveIntervals::computeDeadValues(LiveInterval &LI,
448448
for (auto VNI : LI.valnos) {
449449
if (VNI->isUnused())
450450
continue;
451-
LiveRange::iterator I = LI.FindSegmentContaining(VNI->def);
451+
SlotIndex Def = VNI->def;
452+
LiveRange::iterator I = LI.FindSegmentContaining(Def);
452453
assert(I != LI.end() && "Missing segment for VNI");
453-
if (I->end != VNI->def.getDeadSlot())
454+
455+
// Is the register live before? Otherwise we may have to add a read-undef
456+
// flag for subregister defs.
457+
if (MRI->tracksSubRegLiveness()) {
458+
if ((I == LI.begin() || std::prev(I)->end < Def) && !VNI->isPHIDef()) {
459+
MachineInstr *MI = getInstructionFromIndex(Def);
460+
MI->addRegisterDefReadUndef(LI.reg);
461+
}
462+
}
463+
464+
if (I->end != Def.getDeadSlot())
454465
continue;
455466
if (VNI->isPHIDef()) {
456467
// This is a dead PHI. Remove it.
457468
VNI->markUnused();
458469
LI.removeSegment(I);
459-
DEBUG(dbgs() << "Dead PHI at " << VNI->def << " may separate interval\n");
470+
DEBUG(dbgs() << "Dead PHI at " << Def << " may separate interval\n");
460471
PHIRemoved = true;
461472
} else {
462473
// This is a dead def. Make sure the instruction knows.
463-
MachineInstr *MI = getInstructionFromIndex(VNI->def);
474+
MachineInstr *MI = getInstructionFromIndex(Def);
464475
assert(MI && "No instruction defining live value");
465476
MI->addRegisterDead(LI.reg, TRI);
466477
if (dead && MI->allDefsAreDead()) {
467-
DEBUG(dbgs() << "All defs dead: " << VNI->def << '\t' << *MI);
478+
DEBUG(dbgs() << "All defs dead: " << Def << '\t' << *MI);
468479
dead->push_back(MI);
469480
}
470481
}

llvm/lib/CodeGen/MachineInstr.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1889,6 +1889,14 @@ bool MachineInstr::addRegisterDead(unsigned Reg,
18891889
return true;
18901890
}
18911891

1892+
void MachineInstr::addRegisterDefReadUndef(unsigned Reg) {
1893+
for (MachineOperand &MO : operands()) {
1894+
if (!MO.isReg() || !MO.isDef() || MO.getReg() != Reg || MO.getSubReg() == 0)
1895+
continue;
1896+
MO.setIsUndef();
1897+
}
1898+
}
1899+
18921900
void MachineInstr::addRegisterDefined(unsigned Reg,
18931901
const TargetRegisterInfo *RegInfo) {
18941902
if (TargetRegisterInfo::isPhysicalRegister(Reg)) {

0 commit comments

Comments
 (0)