[llvm] [LiveIntervals] repairIntervalsInRange: recompute width changes (PR #78564)
Carl Ritson via llvm-commits
llvm-commits at lists.llvm.org
Sun Jan 21 00:59:00 PST 2024
================
@@ -1666,13 +1666,30 @@ LiveIntervals::repairIntervalsInRange(MachineBasicBlock *MBB,
for (const MachineOperand &MO : MI.operands()) {
if (MO.isReg() && MO.getReg().isVirtual()) {
Register Reg = MO.getReg();
- // If the new instructions refer to subregs but the old instructions did
- // not, throw away any old live interval so it will be recomputed with
- // subranges.
if (MO.getSubReg() && hasInterval(Reg) &&
- !getInterval(Reg).hasSubRanges() &&
- MRI->shouldTrackSubRegLiveness(Reg))
- removeInterval(Reg);
+ MRI->shouldTrackSubRegLiveness(Reg)) {
+ LiveInterval &LI = getInterval(Reg);
+ if (!LI.hasSubRanges()) {
+ // If the new instructions refer to subregs but the old instructions
+ // did not, throw away any old live interval so it will be
+ // recomputed with subranges.
+ removeInterval(Reg);
+ } else if (MO.isDef()) {
+ // Similarly if a subreg def has no precise subrange match then
+ // assume we need to recompute all subranges.
+ unsigned SubReg = MO.getSubReg();
+ LaneBitmask Mask = TRI->getSubRegIndexLaneMask(SubReg);
+ bool hasMatch = false;
+ for (auto &SR : LI.subranges()) {
----------------
perlfu wrote:
Unfortunately cannot use `std::none_of` as `subranges()` is not a typical iterator type (custom single linked list iterator).
https://github.com/llvm/llvm-project/pull/78564
More information about the llvm-commits
mailing list