@@ -141,6 +141,7 @@ void ModuloScheduleExpander::generatePipelinedLoop() {
141141 MachineInstr *NewMI = cloneInstr (CI, MaxStageCount, StageNum);
142142 updateInstruction (NewMI, false , MaxStageCount, StageNum, VRMap);
143143 KernelBB->push_back (NewMI);
144+ LIS.InsertMachineInstrInMaps (*NewMI);
144145 InstrMap[NewMI] = CI;
145146 }
146147
@@ -150,6 +151,7 @@ void ModuloScheduleExpander::generatePipelinedLoop() {
150151 MachineInstr *NewMI = MF.CloneMachineInstr (&MI);
151152 updateInstruction (NewMI, false , MaxStageCount, 0 , VRMap);
152153 KernelBB->push_back (NewMI);
154+ LIS.InsertMachineInstrInMaps (*NewMI);
153155 InstrMap[NewMI] = &MI;
154156 }
155157
@@ -179,6 +181,8 @@ void ModuloScheduleExpander::generatePipelinedLoop() {
179181 // Add branches between prolog and epilog blocks.
180182 addBranches (*Preheader, PrologBBs, KernelBB, EpilogBBs, VRMap);
181183
184+ recalcEmptyIntervals ();
185+
182186 delete[] VRMap;
183187 delete[] VRMapPhi;
184188}
@@ -226,6 +230,7 @@ void ModuloScheduleExpander::generateProlog(unsigned LastStage,
226230 cloneAndChangeInstr (&*BBI, i, (unsigned )StageNum);
227231 updateInstruction (NewMI, false , i, (unsigned )StageNum, VRMap);
228232 NewBB->push_back (NewMI);
233+ LIS.InsertMachineInstrInMaps (*NewMI);
229234 InstrMap[NewMI] = &*BBI;
230235 }
231236 }
@@ -303,6 +308,7 @@ void ModuloScheduleExpander::generateEpilog(
303308 MachineInstr *NewMI = cloneInstr (In, UINT_MAX, 0 );
304309 updateInstruction (NewMI, i == 1 , EpilogStage, 0 , VRMap);
305310 NewBB->push_back (NewMI);
311+ LIS.InsertMachineInstrInMaps (*NewMI);
306312 InstrMap[NewMI] = In;
307313 }
308314 }
@@ -344,13 +350,16 @@ void ModuloScheduleExpander::generateEpilog(
344350static void replaceRegUsesAfterLoop (Register FromReg, Register ToReg,
345351 MachineBasicBlock *MBB,
346352 MachineRegisterInfo &MRI,
347- LiveIntervals &LIS) {
353+ LiveIntervals &LIS,
354+ SmallVector<Register> &EmptyIntervalRegs) {
348355 for (MachineOperand &O :
349356 llvm::make_early_inc_range (MRI.use_operands (FromReg)))
350357 if (O.getParent ()->getParent () != MBB)
351358 O.setReg (ToReg);
352- if (!LIS.hasInterval (ToReg))
359+ if (!LIS.hasInterval (ToReg)) {
353360 LIS.createEmptyInterval (ToReg);
361+ EmptyIntervalRegs.push_back (ToReg);
362+ }
354363}
355364
356365// / Return true if the register has a use that occurs outside the
@@ -542,7 +551,8 @@ void ModuloScheduleExpander::generateExistingPhis(
542551 PhiOp2 = VRMap[LastStageNum - np - 1 ][LoopVal];
543552
544553 if (IsLast && np == NumPhis - 1 )
545- replaceRegUsesAfterLoop (Def, NewReg, BB, MRI, LIS);
554+ replaceRegUsesAfterLoop (Def, NewReg, BB, MRI, LIS,
555+ EmptyIntervalRegs);
546556 continue ;
547557 }
548558 }
@@ -560,6 +570,7 @@ void ModuloScheduleExpander::generateExistingPhis(
560570 TII->get (TargetOpcode::PHI), NewReg);
561571 NewPhi.addReg (PhiOp1).addMBB (BB1);
562572 NewPhi.addReg (PhiOp2).addMBB (BB2);
573+ LIS.InsertMachineInstrInMaps (*NewPhi);
563574 if (np == 0 )
564575 InstrMap[NewPhi] = &*BBI;
565576
@@ -582,7 +593,7 @@ void ModuloScheduleExpander::generateExistingPhis(
582593 // register to replace depends on whether the Phi is scheduled in the
583594 // epilog.
584595 if (IsLast && np == NumPhis - 1 )
585- replaceRegUsesAfterLoop (Def, NewReg, BB, MRI, LIS);
596+ replaceRegUsesAfterLoop (Def, NewReg, BB, MRI, LIS, EmptyIntervalRegs );
586597
587598 // In the kernel, a dependent Phi uses the value from this Phi.
588599 if (InKernel)
@@ -602,7 +613,8 @@ void ModuloScheduleExpander::generateExistingPhis(
602613 if (NumStages == 0 && IsLast) {
603614 auto It = VRMap[CurStageNum].find (LoopVal);
604615 if (It != VRMap[CurStageNum].end ())
605- replaceRegUsesAfterLoop (Def, It->second , BB, MRI, LIS);
616+ replaceRegUsesAfterLoop (Def, It->second , BB, MRI, LIS,
617+ EmptyIntervalRegs);
606618 }
607619 }
608620}
@@ -702,6 +714,7 @@ void ModuloScheduleExpander::generatePhis(
702714 TII->get (TargetOpcode::PHI), NewReg);
703715 NewPhi.addReg (PhiOp1).addMBB (BB1);
704716 NewPhi.addReg (PhiOp2).addMBB (BB2);
717+ LIS.InsertMachineInstrInMaps (*NewPhi);
705718 if (np == 0 )
706719 InstrMap[NewPhi] = &*BBI;
707720
@@ -722,7 +735,7 @@ void ModuloScheduleExpander::generatePhis(
722735 NewReg);
723736 }
724737 if (IsLast && np == NumPhis - 1 )
725- replaceRegUsesAfterLoop (Def, NewReg, BB, MRI, LIS);
738+ replaceRegUsesAfterLoop (Def, NewReg, BB, MRI, LIS, EmptyIntervalRegs );
726739 }
727740 }
728741 }
@@ -831,9 +844,11 @@ void ModuloScheduleExpander::splitLifetimes(MachineBasicBlock *KernelBB,
831844 // We split the lifetime when we find the first use.
832845 if (!SplitReg) {
833846 SplitReg = MRI.createVirtualRegister (MRI.getRegClass (Def));
834- BuildMI (*KernelBB, MI, MI->getDebugLoc (),
835- TII->get (TargetOpcode::COPY), SplitReg)
836- .addReg (Def);
847+ MachineInstr *newCopy =
848+ BuildMI (*KernelBB, MI, MI->getDebugLoc (),
849+ TII->get (TargetOpcode::COPY), SplitReg)
850+ .addReg (Def);
851+ LIS.InsertMachineInstrInMaps (*newCopy);
837852 }
838853 BBJ.substituteRegister (Def, SplitReg, 0 , *TRI);
839854 }
@@ -901,13 +916,17 @@ void ModuloScheduleExpander::addBranches(MachineBasicBlock &PreheaderBB,
901916 removePhis (Epilog, LastEpi);
902917 // Remove the blocks that are no longer referenced.
903918 if (LastPro != LastEpi) {
919+ for (auto &MI : *LastEpi)
920+ LIS.RemoveMachineInstrFromMaps (MI);
904921 LastEpi->clear ();
905922 LastEpi->eraseFromParent ();
906923 }
907924 if (LastPro == KernelBB) {
908925 LoopInfo->disposed (&LIS);
909926 NewKernel = nullptr ;
910927 }
928+ for (auto &MI : *LastPro)
929+ LIS.RemoveMachineInstrFromMaps (MI);
911930 LastPro->clear ();
912931 LastPro->eraseFromParent ();
913932 } else {
@@ -928,6 +947,25 @@ void ModuloScheduleExpander::addBranches(MachineBasicBlock &PreheaderBB,
928947 }
929948}
930949
950+ // / Some new registers are generated during the kernel expansion. We recalculate
951+ // / the live intervals of these registers after the expansion.
952+ void ModuloScheduleExpander::recalcEmptyIntervals () {
953+ // The interval can be computed if the register's non-debug users have
954+ // slot indexes.
955+ auto CanRecalculateInterval = [this ](unsigned Reg) -> bool {
956+ for (auto &Opnd : this ->MRI .reg_nodbg_operands (Reg))
957+ if (this ->LIS .isNotInMIMap (*Opnd.getParent ()))
958+ return false ;
959+ return true ;
960+ };
961+ for (auto Reg : EmptyIntervalRegs)
962+ if (CanRecalculateInterval (Reg)) {
963+ LIS.removeInterval (Reg);
964+ LIS.createAndComputeVirtRegInterval (Reg);
965+ }
966+ EmptyIntervalRegs.clear ();
967+ }
968+
931969// / Return true if we can compute the amount the instruction changes
932970// / during each iteration. Set Delta to the amount of the change.
933971bool ModuloScheduleExpander::computeDelta (MachineInstr &MI, unsigned &Delta) {
@@ -1049,7 +1087,7 @@ void ModuloScheduleExpander::updateInstruction(MachineInstr *NewMI,
10491087 MO.setReg (NewReg);
10501088 VRMap[CurStageNum][reg] = NewReg;
10511089 if (LastDef)
1052- replaceRegUsesAfterLoop (reg, NewReg, BB, MRI, LIS);
1090+ replaceRegUsesAfterLoop (reg, NewReg, BB, MRI, LIS, EmptyIntervalRegs );
10531091 } else if (MO.isUse ()) {
10541092 MachineInstr *Def = MRI.getVRegDef (reg);
10551093 // Compute the stage that contains the last definition for instruction.
@@ -1198,10 +1236,11 @@ void ModuloScheduleExpander::rewriteScheduledInstr(
11981236 UseOp.setReg (ReplaceReg);
11991237 else {
12001238 Register SplitReg = MRI.createVirtualRegister (MRI.getRegClass (OldReg));
1201- BuildMI (*BB, UseMI, UseMI->getDebugLoc (), TII-> get (TargetOpcode::COPY ),
1202- SplitReg)
1203- .addReg (ReplaceReg);
1239+ MachineInstr *newCopy = BuildMI (*BB, UseMI, UseMI->getDebugLoc (),
1240+ TII-> get (TargetOpcode::COPY), SplitReg)
1241+ .addReg (ReplaceReg);
12041242 UseOp.setReg (SplitReg);
1243+ LIS.InsertMachineInstrInMaps (*newCopy);
12051244 }
12061245 }
12071246 }
0 commit comments