@@ -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,10 @@ void ModuloScheduleExpander::generatePipelinedLoop() {
179181 // Add branches between prolog and epilog blocks.
180182 addBranches (*Preheader, PrologBBs, KernelBB, EpilogBBs, VRMap);
181183
184+ // The intervals of newly created virtual registers are calculated after the
185+ // kernel expansion.
186+ calculateIntervals ();
187+
182188 delete[] VRMap;
183189 delete[] VRMapPhi;
184190}
@@ -226,6 +232,7 @@ void ModuloScheduleExpander::generateProlog(unsigned LastStage,
226232 cloneAndChangeInstr (&*BBI, i, (unsigned )StageNum);
227233 updateInstruction (NewMI, false , i, (unsigned )StageNum, VRMap);
228234 NewBB->push_back (NewMI);
235+ LIS.InsertMachineInstrInMaps (*NewMI);
229236 InstrMap[NewMI] = &*BBI;
230237 }
231238 }
@@ -303,6 +310,7 @@ void ModuloScheduleExpander::generateEpilog(
303310 MachineInstr *NewMI = cloneInstr (In, UINT_MAX, 0 );
304311 updateInstruction (NewMI, i == 1 , EpilogStage, 0 , VRMap);
305312 NewBB->push_back (NewMI);
313+ LIS.InsertMachineInstrInMaps (*NewMI);
306314 InstrMap[NewMI] = In;
307315 }
308316 }
@@ -343,14 +351,11 @@ void ModuloScheduleExpander::generateEpilog(
343351// / basic block with ToReg.
344352static void replaceRegUsesAfterLoop (Register FromReg, Register ToReg,
345353 MachineBasicBlock *MBB,
346- MachineRegisterInfo &MRI,
347- LiveIntervals &LIS) {
354+ MachineRegisterInfo &MRI) {
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))
353- LIS.createEmptyInterval (ToReg);
354359}
355360
356361// / Return true if the register has a use that occurs outside the
@@ -544,8 +549,10 @@ void ModuloScheduleExpander::generateExistingPhis(
544549 if (VRMap[LastStageNum - np - 1 ].count (LoopVal))
545550 PhiOp2 = VRMap[LastStageNum - np - 1 ][LoopVal];
546551
547- if (IsLast && np == NumPhis - 1 )
548- replaceRegUsesAfterLoop (Def, NewReg, BB, MRI, LIS);
552+ if (IsLast && np == NumPhis - 1 ) {
553+ replaceRegUsesAfterLoop (Def, NewReg, BB, MRI);
554+ NoIntervalRegs.push_back (NewReg);
555+ }
549556 continue ;
550557 }
551558 }
@@ -563,6 +570,7 @@ void ModuloScheduleExpander::generateExistingPhis(
563570 TII->get (TargetOpcode::PHI), NewReg);
564571 NewPhi.addReg (PhiOp1).addMBB (BB1);
565572 NewPhi.addReg (PhiOp2).addMBB (BB2);
573+ LIS.InsertMachineInstrInMaps (*NewPhi);
566574 if (np == 0 )
567575 InstrMap[NewPhi] = &*BBI;
568576
@@ -584,8 +592,10 @@ void ModuloScheduleExpander::generateExistingPhis(
584592 // Check if we need to rename any uses that occurs after the loop. The
585593 // register to replace depends on whether the Phi is scheduled in the
586594 // epilog.
587- if (IsLast && np == NumPhis - 1 )
588- replaceRegUsesAfterLoop (Def, NewReg, BB, MRI, LIS);
595+ if (IsLast && np == NumPhis - 1 ) {
596+ replaceRegUsesAfterLoop (Def, NewReg, BB, MRI);
597+ NoIntervalRegs.push_back (NewReg);
598+ }
589599
590600 // In the kernel, a dependent Phi uses the value from this Phi.
591601 if (InKernel)
@@ -603,9 +613,12 @@ void ModuloScheduleExpander::generateExistingPhis(
603613 // Check if we need to rename a Phi that has been eliminated due to
604614 // scheduling.
605615 if (NumStages == 0 && IsLast) {
606- auto It = VRMap[CurStageNum].find (LoopVal);
607- if (It != VRMap[CurStageNum].end ())
608- replaceRegUsesAfterLoop (Def, It->second , BB, MRI, LIS);
616+ auto &CurStageMap = VRMap[CurStageNum];
617+ auto It = CurStageMap.find (LoopVal);
618+ if (It != CurStageMap.end ()) {
619+ replaceRegUsesAfterLoop (Def, It->second , BB, MRI);
620+ NoIntervalRegs.push_back (It->second );
621+ }
609622 }
610623 }
611624}
@@ -705,6 +718,7 @@ void ModuloScheduleExpander::generatePhis(
705718 TII->get (TargetOpcode::PHI), NewReg);
706719 NewPhi.addReg (PhiOp1).addMBB (BB1);
707720 NewPhi.addReg (PhiOp2).addMBB (BB2);
721+ LIS.InsertMachineInstrInMaps (*NewPhi);
708722 if (np == 0 )
709723 InstrMap[NewPhi] = &*BBI;
710724
@@ -724,8 +738,10 @@ void ModuloScheduleExpander::generatePhis(
724738 rewriteScheduledInstr (NewBB, InstrMap, CurStageNum, np, &*BBI, Def,
725739 NewReg);
726740 }
727- if (IsLast && np == NumPhis - 1 )
728- replaceRegUsesAfterLoop (Def, NewReg, BB, MRI, LIS);
741+ if (IsLast && np == NumPhis - 1 ) {
742+ replaceRegUsesAfterLoop (Def, NewReg, BB, MRI);
743+ NoIntervalRegs.push_back (NewReg);
744+ }
729745 }
730746 }
731747 }
@@ -834,9 +850,11 @@ void ModuloScheduleExpander::splitLifetimes(MachineBasicBlock *KernelBB,
834850 // We split the lifetime when we find the first use.
835851 if (!SplitReg) {
836852 SplitReg = MRI.createVirtualRegister (MRI.getRegClass (Def));
837- BuildMI (*KernelBB, MI, MI->getDebugLoc (),
838- TII->get (TargetOpcode::COPY), SplitReg)
839- .addReg (Def);
853+ MachineInstr *newCopy =
854+ BuildMI (*KernelBB, MI, MI->getDebugLoc (),
855+ TII->get (TargetOpcode::COPY), SplitReg)
856+ .addReg (Def);
857+ LIS.InsertMachineInstrInMaps (*newCopy);
840858 }
841859 BBJ.substituteRegister (Def, SplitReg, 0 , *TRI);
842860 }
@@ -904,13 +922,17 @@ void ModuloScheduleExpander::addBranches(MachineBasicBlock &PreheaderBB,
904922 removePhis (Epilog, LastEpi);
905923 // Remove the blocks that are no longer referenced.
906924 if (LastPro != LastEpi) {
925+ for (auto &MI : *LastEpi)
926+ LIS.RemoveMachineInstrFromMaps (MI);
907927 LastEpi->clear ();
908928 LastEpi->eraseFromParent ();
909929 }
910930 if (LastPro == KernelBB) {
911931 LoopInfo->disposed (&LIS);
912932 NewKernel = nullptr ;
913933 }
934+ for (auto &MI : *LastPro)
935+ LIS.RemoveMachineInstrFromMaps (MI);
914936 LastPro->clear ();
915937 LastPro->eraseFromParent ();
916938 } else {
@@ -931,6 +953,14 @@ void ModuloScheduleExpander::addBranches(MachineBasicBlock &PreheaderBB,
931953 }
932954}
933955
956+ // / Some registers are generated during the kernel expansion. We calculate the
957+ // / live intervals of these registers after the expansion.
958+ void ModuloScheduleExpander::calculateIntervals () {
959+ for (Register Reg : NoIntervalRegs)
960+ LIS.createAndComputeVirtRegInterval (Reg);
961+ NoIntervalRegs.clear ();
962+ }
963+
934964// / Return true if we can compute the amount the instruction changes
935965// / during each iteration. Set Delta to the amount of the change.
936966bool ModuloScheduleExpander::computeDelta (MachineInstr &MI, unsigned &Delta) {
@@ -1051,8 +1081,10 @@ void ModuloScheduleExpander::updateInstruction(MachineInstr *NewMI,
10511081 Register NewReg = MRI.createVirtualRegister (RC);
10521082 MO.setReg (NewReg);
10531083 VRMap[CurStageNum][reg] = NewReg;
1054- if (LastDef)
1055- replaceRegUsesAfterLoop (reg, NewReg, BB, MRI, LIS);
1084+ if (LastDef) {
1085+ replaceRegUsesAfterLoop (reg, NewReg, BB, MRI);
1086+ NoIntervalRegs.push_back (NewReg);
1087+ }
10561088 } else if (MO.isUse ()) {
10571089 MachineInstr *Def = MRI.getVRegDef (reg);
10581090 // Compute the stage that contains the last definition for instruction.
@@ -1201,10 +1233,11 @@ void ModuloScheduleExpander::rewriteScheduledInstr(
12011233 UseOp.setReg (ReplaceReg);
12021234 else {
12031235 Register SplitReg = MRI.createVirtualRegister (MRI.getRegClass (OldReg));
1204- BuildMI (*BB, UseMI, UseMI->getDebugLoc (), TII-> get (TargetOpcode::COPY ),
1205- SplitReg)
1206- .addReg (ReplaceReg);
1236+ MachineInstr *newCopy = BuildMI (*BB, UseMI, UseMI->getDebugLoc (),
1237+ TII-> get (TargetOpcode::COPY), SplitReg)
1238+ .addReg (ReplaceReg);
12071239 UseOp.setReg (SplitReg);
1240+ LIS.InsertMachineInstrInMaps (*newCopy);
12081241 }
12091242 }
12101243 }
0 commit comments