Skip to content

Commit d610a51

Browse files
RenameIndependentSubregs: Add missing sub-range for new IMPLICIT_DEFs (#89050)
Existing sub-ranges are correctly updated because new IMPLICIT_DEF is added, but there is missing sub-range for IMPLICIT_DEF itself. Because of missing sub-range in live-intervals for IMPLICIT_DEF, register allocator does not know that IMPLICIT_DEF rewrites its virtual sub-registers and can end up assigning overlapping physical registers to them. This results in deleting instructions that were defined by sub-registers overwritten by IMPLICIT_DEF as they are now dead.
1 parent 34caafe commit d610a51

File tree

3 files changed

+179
-150
lines changed

3 files changed

+179
-150
lines changed

llvm/lib/CodeGen/RenameIndependentSubregs.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,10 +334,17 @@ void RenameIndependentSubregs::computeMainRangesFixFlags(
334334
DebugLoc(), MCDesc, Reg);
335335
SlotIndex DefIdx = LIS->InsertMachineInstrInMaps(*ImpDef);
336336
SlotIndex RegDefIdx = DefIdx.getRegSlot();
337+
LaneBitmask Mask = MRI->getMaxLaneMaskForVReg(Reg);
337338
for (LiveInterval::SubRange &SR : LI.subranges()) {
339+
Mask = Mask & ~SR.LaneMask;
338340
VNInfo *SRVNI = SR.getNextValue(RegDefIdx, Allocator);
339341
SR.addSegment(LiveRange::Segment(RegDefIdx, PredEnd, SRVNI));
340342
}
343+
344+
if (!Mask.none()) {
345+
LiveInterval::SubRange *SR = LI.createSubRange(Allocator, Mask);
346+
SR->createDeadDef(RegDefIdx, Allocator);
347+
}
341348
}
342349
}
343350
}

0 commit comments

Comments
 (0)