@@ -64,7 +64,7 @@ static void increaseSetPressure(std::vector<unsigned> &CurrSetPressure,
64
64
static void decreaseSetPressure (std::vector<unsigned > &CurrSetPressure,
65
65
const MachineRegisterInfo &MRI, Register Reg,
66
66
LaneBitmask PrevMask, LaneBitmask NewMask) {
67
- // assert((NewMask & ! PrevMask) == 0 && "Must not add bits");
67
+ assert ((NewMask & ~ PrevMask). none () && " Must not add bits" );
68
68
if (NewMask.any () || PrevMask.none ())
69
69
return ;
70
70
@@ -617,17 +617,11 @@ void RegisterOperands::adjustLaneLiveness(const LiveIntervals &LIS,
617
617
++I;
618
618
}
619
619
}
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
+
631
625
if (AddFlagsMI != nullptr ) {
632
626
for (const RegisterMaskPair &P : DeadDefs) {
633
627
Register RegUnit = P.RegUnit ;
@@ -1060,18 +1054,27 @@ void RegPressureTracker::bumpUpwardPressure(const MachineInstr *MI) {
1060
1054
// Kill liveness at live defs.
1061
1055
for (const RegisterMaskPair &P : RegOpers.Defs ) {
1062
1056
Register Reg = P.RegUnit ;
1063
- LaneBitmask LiveLanes = LiveRegs.contains (Reg);
1057
+ LaneBitmask LiveAfter = LiveRegs.contains (Reg);
1064
1058
LaneBitmask UseLanes = getRegLanes (RegOpers.Uses , Reg);
1065
1059
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);
1068
1067
}
1069
1068
// Generate liveness for uses.
1070
1069
for (const RegisterMaskPair &P : RegOpers.Uses ) {
1071
1070
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);
1075
1078
}
1076
1079
}
1077
1080
0 commit comments