@@ -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 (unsigned FromReg, unsigned 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
@@ -541,8 +546,10 @@ void ModuloScheduleExpander::generateExistingPhis(
541546 if (VRMap[LastStageNum - np - 1 ].count (LoopVal))
542547 PhiOp2 = VRMap[LastStageNum - np - 1 ][LoopVal];
543548
544- if (IsLast && np == NumPhis - 1 )
545- replaceRegUsesAfterLoop (Def, NewReg, BB, MRI, LIS);
549+ if (IsLast && np == NumPhis - 1 ) {
550+ replaceRegUsesAfterLoop (Def, NewReg, BB, MRI);
551+ NoIntervalRegs.push_back (NewReg);
552+ }
546553 continue ;
547554 }
548555 }
@@ -560,6 +567,7 @@ void ModuloScheduleExpander::generateExistingPhis(
560567 TII->get (TargetOpcode::PHI), NewReg);
561568 NewPhi.addReg (PhiOp1).addMBB (BB1);
562569 NewPhi.addReg (PhiOp2).addMBB (BB2);
570+ LIS.InsertMachineInstrInMaps (*NewPhi);
563571 if (np == 0 )
564572 InstrMap[NewPhi] = &*BBI;
565573
@@ -581,8 +589,10 @@ void ModuloScheduleExpander::generateExistingPhis(
581589 // Check if we need to rename any uses that occurs after the loop. The
582590 // register to replace depends on whether the Phi is scheduled in the
583591 // epilog.
584- if (IsLast && np == NumPhis - 1 )
585- replaceRegUsesAfterLoop (Def, NewReg, BB, MRI, LIS);
592+ if (IsLast && np == NumPhis - 1 ) {
593+ replaceRegUsesAfterLoop (Def, NewReg, BB, MRI);
594+ NoIntervalRegs.push_back (NewReg);
595+ }
586596
587597 // In the kernel, a dependent Phi uses the value from this Phi.
588598 if (InKernel)
@@ -600,9 +610,12 @@ void ModuloScheduleExpander::generateExistingPhis(
600610 // Check if we need to rename a Phi that has been eliminated due to
601611 // scheduling.
602612 if (NumStages == 0 && IsLast) {
603- auto It = VRMap[CurStageNum].find (LoopVal);
604- if (It != VRMap[CurStageNum].end ())
605- replaceRegUsesAfterLoop (Def, It->second , BB, MRI, LIS);
613+ auto &CurStageMap = VRMap[CurStageNum];
614+ auto It = CurStageMap.find (LoopVal);
615+ if (It != CurStageMap.end ()) {
616+ replaceRegUsesAfterLoop (Def, It->second , BB, MRI);
617+ NoIntervalRegs.push_back (It->second );
618+ }
606619 }
607620 }
608621}
@@ -702,6 +715,7 @@ void ModuloScheduleExpander::generatePhis(
702715 TII->get (TargetOpcode::PHI), NewReg);
703716 NewPhi.addReg (PhiOp1).addMBB (BB1);
704717 NewPhi.addReg (PhiOp2).addMBB (BB2);
718+ LIS.InsertMachineInstrInMaps (*NewPhi);
705719 if (np == 0 )
706720 InstrMap[NewPhi] = &*BBI;
707721
@@ -721,8 +735,10 @@ void ModuloScheduleExpander::generatePhis(
721735 rewriteScheduledInstr (NewBB, InstrMap, CurStageNum, np, &*BBI, Def,
722736 NewReg);
723737 }
724- if (IsLast && np == NumPhis - 1 )
725- replaceRegUsesAfterLoop (Def, NewReg, BB, MRI, LIS);
738+ if (IsLast && np == NumPhis - 1 ) {
739+ replaceRegUsesAfterLoop (Def, NewReg, BB, MRI);
740+ NoIntervalRegs.push_back (NewReg);
741+ }
726742 }
727743 }
728744 }
@@ -831,9 +847,11 @@ void ModuloScheduleExpander::splitLifetimes(MachineBasicBlock *KernelBB,
831847 // We split the lifetime when we find the first use.
832848 if (SplitReg == 0 ) {
833849 SplitReg = MRI.createVirtualRegister (MRI.getRegClass (Def));
834- BuildMI (*KernelBB, MI, MI->getDebugLoc (),
835- TII->get (TargetOpcode::COPY), SplitReg)
836- .addReg (Def);
850+ MachineInstr *newCopy =
851+ BuildMI (*KernelBB, MI, MI->getDebugLoc (),
852+ TII->get (TargetOpcode::COPY), SplitReg)
853+ .addReg (Def);
854+ LIS.InsertMachineInstrInMaps (*newCopy);
837855 }
838856 BBJ.substituteRegister (Def, SplitReg, 0 , *TRI);
839857 }
@@ -901,13 +919,17 @@ void ModuloScheduleExpander::addBranches(MachineBasicBlock &PreheaderBB,
901919 removePhis (Epilog, LastEpi);
902920 // Remove the blocks that are no longer referenced.
903921 if (LastPro != LastEpi) {
922+ for (auto &MI : *LastEpi)
923+ LIS.RemoveMachineInstrFromMaps (MI);
904924 LastEpi->clear ();
905925 LastEpi->eraseFromParent ();
906926 }
907927 if (LastPro == KernelBB) {
908928 LoopInfo->disposed (&LIS);
909929 NewKernel = nullptr ;
910930 }
931+ for (auto &MI : *LastPro)
932+ LIS.RemoveMachineInstrFromMaps (MI);
911933 LastPro->clear ();
912934 LastPro->eraseFromParent ();
913935 } else {
@@ -928,6 +950,14 @@ void ModuloScheduleExpander::addBranches(MachineBasicBlock &PreheaderBB,
928950 }
929951}
930952
953+ // / Some registers are generated during the kernel expansion. We calculate the
954+ // / live intervals of these registers after the expansion.
955+ void ModuloScheduleExpander::calculateIntervals () {
956+ for (Register Reg : NoIntervalRegs)
957+ LIS.createAndComputeVirtRegInterval (Reg);
958+ NoIntervalRegs.clear ();
959+ }
960+
931961// / Return true if we can compute the amount the instruction changes
932962// / during each iteration. Set Delta to the amount of the change.
933963bool ModuloScheduleExpander::computeDelta (MachineInstr &MI, unsigned &Delta) {
@@ -1048,8 +1078,10 @@ void ModuloScheduleExpander::updateInstruction(MachineInstr *NewMI,
10481078 Register NewReg = MRI.createVirtualRegister (RC);
10491079 MO.setReg (NewReg);
10501080 VRMap[CurStageNum][reg] = NewReg;
1051- if (LastDef)
1052- replaceRegUsesAfterLoop (reg, NewReg, BB, MRI, LIS);
1081+ if (LastDef) {
1082+ replaceRegUsesAfterLoop (reg, NewReg, BB, MRI);
1083+ NoIntervalRegs.push_back (NewReg);
1084+ }
10531085 } else if (MO.isUse ()) {
10541086 MachineInstr *Def = MRI.getVRegDef (reg);
10551087 // Compute the stage that contains the last definition for instruction.
@@ -1198,10 +1230,11 @@ void ModuloScheduleExpander::rewriteScheduledInstr(
11981230 UseOp.setReg (ReplaceReg);
11991231 else {
12001232 Register SplitReg = MRI.createVirtualRegister (MRI.getRegClass (OldReg));
1201- BuildMI (*BB, UseMI, UseMI->getDebugLoc (), TII-> get (TargetOpcode::COPY ),
1202- SplitReg)
1203- .addReg (ReplaceReg);
1233+ MachineInstr *newCopy = BuildMI (*BB, UseMI, UseMI->getDebugLoc (),
1234+ TII-> get (TargetOpcode::COPY), SplitReg)
1235+ .addReg (ReplaceReg);
12041236 UseOp.setReg (SplitReg);
1237+ LIS.InsertMachineInstrInMaps (*newCopy);
12051238 }
12061239 }
12071240 }
0 commit comments