Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 20d653f

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

File tree

Expand file treeCollapse file tree

1 file changed

+21
-18
lines changed
Filter options
Expand file treeCollapse file tree

1 file changed

+21
-18
lines changed

‎llvm/lib/CodeGen/RegisterPressure.cpp

Copy file name to clipboardExpand all lines: llvm/lib/CodeGen/RegisterPressure.cpp
+21-18Lines 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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.