@@ -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,8 @@ void ModuloScheduleExpander::generatePipelinedLoop() {
179
181
// Add branches between prolog and epilog blocks.
180
182
addBranches (*Preheader, PrologBBs, KernelBB, EpilogBBs, VRMap);
181
183
184
+ recalcEmptyIntervals ();
185
+
182
186
delete[] VRMap;
183
187
delete[] VRMapPhi;
184
188
}
@@ -226,6 +230,7 @@ void ModuloScheduleExpander::generateProlog(unsigned LastStage,
226
230
cloneAndChangeInstr (&*BBI, i, (unsigned )StageNum);
227
231
updateInstruction (NewMI, false , i, (unsigned )StageNum, VRMap);
228
232
NewBB->push_back (NewMI);
233
+ LIS.InsertMachineInstrInMaps (*NewMI);
229
234
InstrMap[NewMI] = &*BBI;
230
235
}
231
236
}
@@ -303,6 +308,7 @@ void ModuloScheduleExpander::generateEpilog(
303
308
MachineInstr *NewMI = cloneInstr (In, UINT_MAX, 0 );
304
309
updateInstruction (NewMI, i == 1 , EpilogStage, 0 , VRMap);
305
310
NewBB->push_back (NewMI);
311
+ LIS.InsertMachineInstrInMaps (*NewMI);
306
312
InstrMap[NewMI] = In;
307
313
}
308
314
}
@@ -344,13 +350,16 @@ void ModuloScheduleExpander::generateEpilog(
344
350
static void replaceRegUsesAfterLoop (Register FromReg, Register ToReg,
345
351
MachineBasicBlock *MBB,
346
352
MachineRegisterInfo &MRI,
347
- LiveIntervals &LIS) {
353
+ LiveIntervals &LIS,
354
+ SmallVector<Register> &EmptyIntervalRegs) {
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))
359
+ if (!LIS.hasInterval (ToReg)) {
353
360
LIS.createEmptyInterval (ToReg);
361
+ EmptyIntervalRegs.push_back (ToReg);
362
+ }
354
363
}
355
364
356
365
// / Return true if the register has a use that occurs outside the
@@ -542,7 +551,8 @@ void ModuloScheduleExpander::generateExistingPhis(
542
551
PhiOp2 = VRMap[LastStageNum - np - 1 ][LoopVal];
543
552
544
553
if (IsLast && np == NumPhis - 1 )
545
- replaceRegUsesAfterLoop (Def, NewReg, BB, MRI, LIS);
554
+ replaceRegUsesAfterLoop (Def, NewReg, BB, MRI, LIS,
555
+ EmptyIntervalRegs);
546
556
continue ;
547
557
}
548
558
}
@@ -560,6 +570,7 @@ void ModuloScheduleExpander::generateExistingPhis(
560
570
TII->get (TargetOpcode::PHI), NewReg);
561
571
NewPhi.addReg (PhiOp1).addMBB (BB1);
562
572
NewPhi.addReg (PhiOp2).addMBB (BB2);
573
+ LIS.InsertMachineInstrInMaps (*NewPhi);
563
574
if (np == 0 )
564
575
InstrMap[NewPhi] = &*BBI;
565
576
@@ -582,7 +593,7 @@ void ModuloScheduleExpander::generateExistingPhis(
582
593
// register to replace depends on whether the Phi is scheduled in the
583
594
// epilog.
584
595
if (IsLast && np == NumPhis - 1 )
585
- replaceRegUsesAfterLoop (Def, NewReg, BB, MRI, LIS);
596
+ replaceRegUsesAfterLoop (Def, NewReg, BB, MRI, LIS, EmptyIntervalRegs );
586
597
587
598
// In the kernel, a dependent Phi uses the value from this Phi.
588
599
if (InKernel)
@@ -602,7 +613,8 @@ void ModuloScheduleExpander::generateExistingPhis(
602
613
if (NumStages == 0 && IsLast) {
603
614
auto It = VRMap[CurStageNum].find (LoopVal);
604
615
if (It != VRMap[CurStageNum].end ())
605
- replaceRegUsesAfterLoop (Def, It->second , BB, MRI, LIS);
616
+ replaceRegUsesAfterLoop (Def, It->second , BB, MRI, LIS,
617
+ EmptyIntervalRegs);
606
618
}
607
619
}
608
620
}
@@ -702,6 +714,7 @@ void ModuloScheduleExpander::generatePhis(
702
714
TII->get (TargetOpcode::PHI), NewReg);
703
715
NewPhi.addReg (PhiOp1).addMBB (BB1);
704
716
NewPhi.addReg (PhiOp2).addMBB (BB2);
717
+ LIS.InsertMachineInstrInMaps (*NewPhi);
705
718
if (np == 0 )
706
719
InstrMap[NewPhi] = &*BBI;
707
720
@@ -722,7 +735,7 @@ void ModuloScheduleExpander::generatePhis(
722
735
NewReg);
723
736
}
724
737
if (IsLast && np == NumPhis - 1 )
725
- replaceRegUsesAfterLoop (Def, NewReg, BB, MRI, LIS);
738
+ replaceRegUsesAfterLoop (Def, NewReg, BB, MRI, LIS, EmptyIntervalRegs );
726
739
}
727
740
}
728
741
}
@@ -831,9 +844,11 @@ void ModuloScheduleExpander::splitLifetimes(MachineBasicBlock *KernelBB,
831
844
// We split the lifetime when we find the first use.
832
845
if (!SplitReg) {
833
846
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);
837
852
}
838
853
BBJ.substituteRegister (Def, SplitReg, 0 , *TRI);
839
854
}
@@ -901,13 +916,17 @@ void ModuloScheduleExpander::addBranches(MachineBasicBlock &PreheaderBB,
901
916
removePhis (Epilog, LastEpi);
902
917
// Remove the blocks that are no longer referenced.
903
918
if (LastPro != LastEpi) {
919
+ for (auto &MI : *LastEpi)
920
+ LIS.RemoveMachineInstrFromMaps (MI);
904
921
LastEpi->clear ();
905
922
LastEpi->eraseFromParent ();
906
923
}
907
924
if (LastPro == KernelBB) {
908
925
LoopInfo->disposed (&LIS);
909
926
NewKernel = nullptr ;
910
927
}
928
+ for (auto &MI : *LastPro)
929
+ LIS.RemoveMachineInstrFromMaps (MI);
911
930
LastPro->clear ();
912
931
LastPro->eraseFromParent ();
913
932
} else {
@@ -928,6 +947,25 @@ void ModuloScheduleExpander::addBranches(MachineBasicBlock &PreheaderBB,
928
947
}
929
948
}
930
949
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
+
931
969
// / Return true if we can compute the amount the instruction changes
932
970
// / during each iteration. Set Delta to the amount of the change.
933
971
bool ModuloScheduleExpander::computeDelta (MachineInstr &MI, unsigned &Delta) {
@@ -1049,7 +1087,7 @@ void ModuloScheduleExpander::updateInstruction(MachineInstr *NewMI,
1049
1087
MO.setReg (NewReg);
1050
1088
VRMap[CurStageNum][reg] = NewReg;
1051
1089
if (LastDef)
1052
- replaceRegUsesAfterLoop (reg, NewReg, BB, MRI, LIS);
1090
+ replaceRegUsesAfterLoop (reg, NewReg, BB, MRI, LIS, EmptyIntervalRegs );
1053
1091
} else if (MO.isUse ()) {
1054
1092
MachineInstr *Def = MRI.getVRegDef (reg);
1055
1093
// Compute the stage that contains the last definition for instruction.
@@ -1198,10 +1236,11 @@ void ModuloScheduleExpander::rewriteScheduledInstr(
1198
1236
UseOp.setReg (ReplaceReg);
1199
1237
else {
1200
1238
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);
1204
1242
UseOp.setReg (SplitReg);
1243
+ LIS.InsertMachineInstrInMaps (*newCopy);
1205
1244
}
1206
1245
}
1207
1246
}
0 commit comments