@@ -64,7 +64,7 @@ static void increaseSetPressure(std::vector<unsigned> &CurrSetPressure,
6464static 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