Skip to content

Commit 20d653f

Browse files
authored
[LLVM][CodeGen] Fix register lane liveness tracking in RegisterPressure (#88892)
Re-enable an old assertion in `decreaseSetPressure`.
1 parent 73140da commit 20d653f

File tree

1 file changed

+21
-18
lines changed

1 file changed

+21
-18
lines changed

llvm/lib/CodeGen/RegisterPressure.cpp

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ static void increaseSetPressure(std::vector<unsigned> &CurrSetPressure,
6464
static void decreaseSetPressure(std::vector<unsigned> &CurrSetPressure,
6565
const MachineRegisterInfo &MRI, Register Reg,
6666
LaneBitmask PrevMask, LaneBitmask NewMask) {
67-
//assert((NewMask & !PrevMask) == 0 && "Must not add bits");
67+
assert((NewMask & ~PrevMask).none() && "Must not add bits");
6868
if (NewMask.any() || PrevMask.none())
6969
return;
7070

@@ -617,17 +617,11 @@ void RegisterOperands::adjustLaneLiveness(const LiveIntervals &LIS,
617617
++I;
618618
}
619619
}
620-
for (auto *I = Uses.begin(); I != Uses.end();) {
621-
LaneBitmask LiveBefore = getLiveLanesAt(LIS, MRI, true, I->RegUnit,
622-
Pos.getBaseIndex());
623-
LaneBitmask LaneMask = I->LaneMask & LiveBefore;
624-
if (LaneMask.none()) {
625-
I = Uses.erase(I);
626-
} else {
627-
I->LaneMask = LaneMask;
628-
++I;
629-
}
630-
}
620+
621+
// For uses just copy the information from LIS.
622+
for (auto &[RegUnit, LaneMask] : Uses)
623+
LaneMask = getLiveLanesAt(LIS, MRI, true, RegUnit, Pos.getBaseIndex());
624+
631625
if (AddFlagsMI != nullptr) {
632626
for (const RegisterMaskPair &P : DeadDefs) {
633627
Register RegUnit = P.RegUnit;
@@ -1060,18 +1054,27 @@ void RegPressureTracker::bumpUpwardPressure(const MachineInstr *MI) {
10601054
// Kill liveness at live defs.
10611055
for (const RegisterMaskPair &P : RegOpers.Defs) {
10621056
Register Reg = P.RegUnit;
1063-
LaneBitmask LiveLanes = LiveRegs.contains(Reg);
1057+
LaneBitmask LiveAfter = LiveRegs.contains(Reg);
10641058
LaneBitmask UseLanes = getRegLanes(RegOpers.Uses, Reg);
10651059
LaneBitmask DefLanes = P.LaneMask;
1066-
LaneBitmask LiveAfter = (LiveLanes & ~DefLanes) | UseLanes;
1067-
decreaseRegPressure(Reg, LiveLanes, LiveAfter);
1060+
LaneBitmask LiveBefore = (LiveAfter & ~DefLanes) | UseLanes;
1061+
1062+
// There may be parts of the register that were dead before the
1063+
// instruction, but became live afterwards. Similarly, some parts
1064+
// may have been killed in this instruction.
1065+
decreaseRegPressure(Reg, LiveAfter, LiveAfter & LiveBefore);
1066+
increaseRegPressure(Reg, LiveAfter, ~LiveAfter & LiveBefore);
10681067
}
10691068
// Generate liveness for uses.
10701069
for (const RegisterMaskPair &P : RegOpers.Uses) {
10711070
Register Reg = P.RegUnit;
1072-
LaneBitmask LiveLanes = LiveRegs.contains(Reg);
1073-
LaneBitmask LiveAfter = LiveLanes | P.LaneMask;
1074-
increaseRegPressure(Reg, LiveLanes, LiveAfter);
1071+
// If this register was also in a def operand, we've handled it
1072+
// with defs.
1073+
if (getRegLanes(RegOpers.Defs, Reg).any())
1074+
continue;
1075+
LaneBitmask LiveAfter = LiveRegs.contains(Reg);
1076+
LaneBitmask LiveBefore = LiveAfter | P.LaneMask;
1077+
increaseRegPressure(Reg, LiveAfter, LiveBefore);
10751078
}
10761079
}
10771080

0 commit comments

Comments
 (0)