[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