[llvm] 6858a17 - [LiveIntervals] Fix incorrect range (re)construction from subranges.
Daniil Fukalov via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 8 06:07:31 PDT 2022
Author: Daniil Fukalov
Date: 2022-07-08T16:07:19+03:00
New Revision: 6858a17f66f6d609e2d801c443da951c391636a0
URL: https://github.com/llvm/llvm-project/commit/6858a17f66f6d609e2d801c443da951c391636a0
DIFF: https://github.com/llvm/llvm-project/commit/6858a17f66f6d609e2d801c443da951c391636a0.diff
LOG: [LiveIntervals] Fix incorrect range (re)construction from subranges.
After D82916 `updateAllRanges()` started to fix holes in main range with
subranges but it fails on instructions with two subregs def which are parts of
one reg. The main range constructed with //all// subranges of subregs just after
processing the first operand. So the main range gets intervals from subranges
those are not updated yet.
The patch takes into account lane mask to update the main range.
Reviewed By: rampitec, arsenm
Differential Revision: https://reviews.llvm.org/D128553
Added:
Modified:
llvm/lib/CodeGen/LiveIntervals.cpp
llvm/unittests/MI/LiveIntervalTest.cpp
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/LiveIntervals.cpp b/llvm/lib/CodeGen/LiveIntervals.cpp
index 7d825a8bf8531..1242ce20b732a 100644
--- a/llvm/lib/CodeGen/LiveIntervals.cpp
+++ b/llvm/lib/CodeGen/LiveIntervals.cpp
@@ -1049,12 +1049,17 @@ class LiveIntervals::HMEditor {
// we may end up with a main range not covering all subranges.
// This is extremely rare case, so let's check and reconstruct the
// main range.
- for (LiveInterval::SubRange &S : LI.subranges()) {
- if (LI.covers(S))
- continue;
- LI.clear();
- LIS.constructMainRangeFromSubranges(LI);
- break;
+ if (LI.hasSubRanges()) {
+ unsigned SubReg = MO.getSubReg();
+ LaneBitmask LaneMask = SubReg ? TRI.getSubRegIndexLaneMask(SubReg)
+ : MRI.getMaxLaneMaskForVReg(Reg);
+ for (LiveInterval::SubRange &S : LI.subranges()) {
+ if ((S.LaneMask & LaneMask).none() || LI.covers(S))
+ continue;
+ LI.clear();
+ LIS.constructMainRangeFromSubranges(LI);
+ break;
+ }
}
continue;
diff --git a/llvm/unittests/MI/LiveIntervalTest.cpp b/llvm/unittests/MI/LiveIntervalTest.cpp
index 7f1dbc3c8a6e4..667a6dfe4c64a 100644
--- a/llvm/unittests/MI/LiveIntervalTest.cpp
+++ b/llvm/unittests/MI/LiveIntervalTest.cpp
@@ -532,6 +532,19 @@ TEST(LiveIntervalTest, TestMoveSubRegUseAcrossMainRangeHole) {
});
}
+TEST(LiveIntervalTest, TestMoveSubRegsOfOneReg) {
+ liveIntervalTest(R"MIR(
+ INLINEASM &"", 0, 1835018, def undef %4.sub0:vreg_64, 1835018, def undef %4.sub1:vreg_64
+ %1:vreg_64 = COPY %4
+ undef %2.sub0:vreg_64 = V_MOV_B32_e32 0, implicit $exec
+ %2.sub1:vreg_64 = COPY %2.sub0
+ %3:vreg_64 = COPY %2
+)MIR", [](MachineFunction &MF, LiveIntervals &LIS) {
+ testHandleMove(MF, LIS, 1, 4);
+ testHandleMove(MF, LIS, 0, 3);
+ });
+}
+
TEST(LiveIntervalTest, BundleUse) {
liveIntervalTest(R"MIR(
%0 = IMPLICIT_DEF
More information about the llvm-commits
mailing list