@@ -141,6 +141,7 @@ void ModuloScheduleExpander::generatePipelinedLoop() {
141
141
MachineInstr *NewMI = cloneInstr (CI, MaxStageCount, StageNum);
142
142
updateInstruction (NewMI, false , MaxStageCount, StageNum, VRMap);
143
143
KernelBB->push_back (NewMI);
144
+ LIS.InsertMachineInstrInMaps (*NewMI);
144
145
InstrMap[NewMI] = CI;
145
146
}
146
147
@@ -150,6 +151,7 @@ void ModuloScheduleExpander::generatePipelinedLoop() {
150
151
MachineInstr *NewMI = MF.CloneMachineInstr (&MI);
151
152
updateInstruction (NewMI, false , MaxStageCount, 0 , VRMap);
152
153
KernelBB->push_back (NewMI);
154
+ LIS.InsertMachineInstrInMaps (*NewMI);
153
155
InstrMap[NewMI] = &MI;
154
156
}
155
157
@@ -179,6 +181,10 @@ void ModuloScheduleExpander::generatePipelinedLoop() {
179
181
// Add branches between prolog and epilog blocks.
180
182
addBranches (*Preheader, PrologBBs, KernelBB, EpilogBBs, VRMap);
181
183
184
+ // The intervals of newly created virtual registers are calculated after the
185
+ // kernel expansion.
186
+ calculateIntervals ();
187
+
182
188
delete[] VRMap;
183
189
delete[] VRMapPhi;
184
190
}
@@ -226,6 +232,7 @@ void ModuloScheduleExpander::generateProlog(unsigned LastStage,
226
232
cloneAndChangeInstr (&*BBI, i, (unsigned )StageNum);
227
233
updateInstruction (NewMI, false , i, (unsigned )StageNum, VRMap);
228
234
NewBB->push_back (NewMI);
235
+ LIS.InsertMachineInstrInMaps (*NewMI);
229
236
InstrMap[NewMI] = &*BBI;
230
237
}
231
238
}
@@ -303,6 +310,7 @@ void ModuloScheduleExpander::generateEpilog(
303
310
MachineInstr *NewMI = cloneInstr (In, UINT_MAX, 0 );
304
311
updateInstruction (NewMI, i == 1 , EpilogStage, 0 , VRMap);
305
312
NewBB->push_back (NewMI);
313
+ LIS.InsertMachineInstrInMaps (*NewMI);
306
314
InstrMap[NewMI] = In;
307
315
}
308
316
}
@@ -343,14 +351,11 @@ void ModuloScheduleExpander::generateEpilog(
343
351
// / basic block with ToReg.
344
352
static void replaceRegUsesAfterLoop (unsigned FromReg, unsigned ToReg,
345
353
MachineBasicBlock *MBB,
346
- MachineRegisterInfo &MRI,
347
- LiveIntervals &LIS) {
354
+ MachineRegisterInfo &MRI) {
348
355
for (MachineOperand &O :
349
356
llvm::make_early_inc_range (MRI.use_operands (FromReg)))
350
357
if (O.getParent ()->getParent () != MBB)
351
358
O.setReg (ToReg);
352
- if (!LIS.hasInterval (ToReg))
353
- LIS.createEmptyInterval (ToReg);
354
359
}
355
360
356
361
// / Return true if the register has a use that occurs outside the
@@ -541,8 +546,10 @@ void ModuloScheduleExpander::generateExistingPhis(
541
546
if (VRMap[LastStageNum - np - 1 ].count (LoopVal))
542
547
PhiOp2 = VRMap[LastStageNum - np - 1 ][LoopVal];
543
548
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
+ }
546
553
continue ;
547
554
}
548
555
}
@@ -560,6 +567,7 @@ void ModuloScheduleExpander::generateExistingPhis(
560
567
TII->get (TargetOpcode::PHI), NewReg);
561
568
NewPhi.addReg (PhiOp1).addMBB (BB1);
562
569
NewPhi.addReg (PhiOp2).addMBB (BB2);
570
+ LIS.InsertMachineInstrInMaps (*NewPhi);
563
571
if (np == 0 )
564
572
InstrMap[NewPhi] = &*BBI;
565
573
@@ -581,8 +589,10 @@ void ModuloScheduleExpander::generateExistingPhis(
581
589
// Check if we need to rename any uses that occurs after the loop. The
582
590
// register to replace depends on whether the Phi is scheduled in the
583
591
// 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
+ }
586
596
587
597
// In the kernel, a dependent Phi uses the value from this Phi.
588
598
if (InKernel)
@@ -600,9 +610,12 @@ void ModuloScheduleExpander::generateExistingPhis(
600
610
// Check if we need to rename a Phi that has been eliminated due to
601
611
// scheduling.
602
612
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
+ }
606
619
}
607
620
}
608
621
}
@@ -702,6 +715,7 @@ void ModuloScheduleExpander::generatePhis(
702
715
TII->get (TargetOpcode::PHI), NewReg);
703
716
NewPhi.addReg (PhiOp1).addMBB (BB1);
704
717
NewPhi.addReg (PhiOp2).addMBB (BB2);
718
+ LIS.InsertMachineInstrInMaps (*NewPhi);
705
719
if (np == 0 )
706
720
InstrMap[NewPhi] = &*BBI;
707
721
@@ -721,8 +735,10 @@ void ModuloScheduleExpander::generatePhis(
721
735
rewriteScheduledInstr (NewBB, InstrMap, CurStageNum, np, &*BBI, Def,
722
736
NewReg);
723
737
}
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
+ }
726
742
}
727
743
}
728
744
}
@@ -831,9 +847,11 @@ void ModuloScheduleExpander::splitLifetimes(MachineBasicBlock *KernelBB,
831
847
// We split the lifetime when we find the first use.
832
848
if (SplitReg == 0 ) {
833
849
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);
837
855
}
838
856
BBJ.substituteRegister (Def, SplitReg, 0 , *TRI);
839
857
}
@@ -901,13 +919,17 @@ void ModuloScheduleExpander::addBranches(MachineBasicBlock &PreheaderBB,
901
919
removePhis (Epilog, LastEpi);
902
920
// Remove the blocks that are no longer referenced.
903
921
if (LastPro != LastEpi) {
922
+ for (auto &MI : *LastEpi)
923
+ LIS.RemoveMachineInstrFromMaps (MI);
904
924
LastEpi->clear ();
905
925
LastEpi->eraseFromParent ();
906
926
}
907
927
if (LastPro == KernelBB) {
908
928
LoopInfo->disposed (&LIS);
909
929
NewKernel = nullptr ;
910
930
}
931
+ for (auto &MI : *LastPro)
932
+ LIS.RemoveMachineInstrFromMaps (MI);
911
933
LastPro->clear ();
912
934
LastPro->eraseFromParent ();
913
935
} else {
@@ -928,6 +950,14 @@ void ModuloScheduleExpander::addBranches(MachineBasicBlock &PreheaderBB,
928
950
}
929
951
}
930
952
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
+
931
961
// / Return true if we can compute the amount the instruction changes
932
962
// / during each iteration. Set Delta to the amount of the change.
933
963
bool ModuloScheduleExpander::computeDelta (MachineInstr &MI, unsigned &Delta) {
@@ -1048,8 +1078,10 @@ void ModuloScheduleExpander::updateInstruction(MachineInstr *NewMI,
1048
1078
Register NewReg = MRI.createVirtualRegister (RC);
1049
1079
MO.setReg (NewReg);
1050
1080
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
+ }
1053
1085
} else if (MO.isUse ()) {
1054
1086
MachineInstr *Def = MRI.getVRegDef (reg);
1055
1087
// Compute the stage that contains the last definition for instruction.
@@ -1198,10 +1230,11 @@ void ModuloScheduleExpander::rewriteScheduledInstr(
1198
1230
UseOp.setReg (ReplaceReg);
1199
1231
else {
1200
1232
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);
1204
1236
UseOp.setReg (SplitReg);
1237
+ LIS.InsertMachineInstrInMaps (*newCopy);
1205
1238
}
1206
1239
}
1207
1240
}
0 commit comments