@@ -67,7 +67,7 @@ AggressiveAntiDepState::AggressiveAntiDepState(const unsigned TargetRegs,
67
67
}
68
68
}
69
69
70
- unsigned AggressiveAntiDepState::GetGroup (unsigned Reg) {
70
+ unsigned AggressiveAntiDepState::GetGroup (MCRegister Reg) {
71
71
unsigned Node = GroupNodeIndices[Reg];
72
72
while (GroupNodes[Node] != Node)
73
73
Node = GroupNodes[Node];
@@ -76,17 +76,16 @@ unsigned AggressiveAntiDepState::GetGroup(unsigned Reg) {
76
76
}
77
77
78
78
void AggressiveAntiDepState::GetGroupRegs (
79
- unsigned Group,
80
- std::vector<unsigned > &Regs,
81
- std::multimap<unsigned , AggressiveAntiDepState::RegisterReference> *RegRefs)
82
- {
79
+ unsigned Group, std::vector<MCRegister> &Regs,
80
+ std::multimap<MCRegister, AggressiveAntiDepState::RegisterReference>
81
+ *RegRefs) {
83
82
for (unsigned Reg = 0 ; Reg != NumTargetRegs; ++Reg) {
84
83
if ((GetGroup (Reg) == Group) && (RegRefs->count (Reg) > 0 ))
85
84
Regs.push_back (Reg);
86
85
}
87
86
}
88
87
89
- unsigned AggressiveAntiDepState::UnionGroups (unsigned Reg1, unsigned Reg2) {
88
+ unsigned AggressiveAntiDepState::UnionGroups (MCRegister Reg1, MCRegister Reg2) {
90
89
assert (GroupNodes[0 ] == 0 && " GroupNode 0 not parent!" );
91
90
assert (GroupNodeIndices[0 ] == 0 && " Reg 0 not in Group 0!" );
92
91
@@ -101,7 +100,7 @@ unsigned AggressiveAntiDepState::UnionGroups(unsigned Reg1, unsigned Reg2) {
101
100
return Parent;
102
101
}
103
102
104
- unsigned AggressiveAntiDepState::LeaveGroup (unsigned Reg) {
103
+ unsigned AggressiveAntiDepState::LeaveGroup (MCRegister Reg) {
105
104
// Create a new GroupNode for Reg. Reg's existing GroupNode must
106
105
// stay as is because there could be other GroupNodes referring to
107
106
// it.
@@ -111,7 +110,7 @@ unsigned AggressiveAntiDepState::LeaveGroup(unsigned Reg) {
111
110
return idx;
112
111
}
113
112
114
- bool AggressiveAntiDepState::IsLive (unsigned Reg) {
113
+ bool AggressiveAntiDepState::IsLive (MCRegister Reg) {
115
114
// KillIndex must be defined and DefIndex not defined for a register
116
115
// to be live.
117
116
return ((KillIndices[Reg] != ~0u ) && (DefIndices[Reg] == ~0u ));
@@ -173,7 +172,7 @@ void AggressiveAntiDepBreaker::StartBlock(MachineBasicBlock *BB) {
173
172
if (!IsReturnBlock && !Pristine.test (Reg))
174
173
continue ;
175
174
for (MCRegAliasIterator AI (Reg, TRI, true ); AI.isValid (); ++AI) {
176
- unsigned AliasReg = *AI;
175
+ MCRegister AliasReg = *AI;
177
176
State->UnionGroups (AliasReg, 0 );
178
177
KillIndices[AliasReg] = BB->size ();
179
178
DefIndices[AliasReg] = ~0u ;
@@ -190,7 +189,7 @@ void AggressiveAntiDepBreaker::Observe(MachineInstr &MI, unsigned Count,
190
189
unsigned InsertPosIndex) {
191
190
assert (Count < InsertPosIndex && " Instruction index out of expected range!" );
192
191
193
- std::set<unsigned > PassthruRegs;
192
+ std::set<MCRegister > PassthruRegs;
194
193
GetPassthruRegs (MI, PassthruRegs);
195
194
PrescanInstruction (MI, Count, PassthruRegs);
196
195
ScanInstruction (MI, Count);
@@ -239,7 +238,7 @@ bool AggressiveAntiDepBreaker::IsImplicitDefUse(MachineInstr &MI,
239
238
}
240
239
241
240
void AggressiveAntiDepBreaker::GetPassthruRegs (
242
- MachineInstr &MI, std::set<unsigned > &PassthruRegs) {
241
+ MachineInstr &MI, std::set<MCRegister > &PassthruRegs) {
243
242
for (unsigned i = 0 , e = MI.getNumOperands (); i != e; ++i) {
244
243
MachineOperand &MO = MI.getOperand (i);
245
244
if (!MO.isReg ()) continue ;
@@ -288,14 +287,14 @@ static const SUnit *CriticalPathStep(const SUnit *SU) {
288
287
return (Next) ? Next->getSUnit () : nullptr ;
289
288
}
290
289
291
- void AggressiveAntiDepBreaker::HandleLastUse (unsigned Reg, unsigned KillIdx,
290
+ void AggressiveAntiDepBreaker::HandleLastUse (MCRegister Reg, unsigned KillIdx,
292
291
const char *tag,
293
292
const char *header,
294
293
const char *footer) {
295
294
std::vector<unsigned > &KillIndices = State->GetKillIndices ();
296
295
std::vector<unsigned > &DefIndices = State->GetDefIndices ();
297
- std::multimap<unsigned , AggressiveAntiDepState::RegisterReference>&
298
- RegRefs = State->GetRegRefs ();
296
+ std::multimap<MCRegister , AggressiveAntiDepState::RegisterReference>
297
+ & RegRefs = State->GetRegRefs ();
299
298
300
299
// FIXME: We must leave subregisters of live super registers as live, so that
301
300
// we don't clear out the register tracking information for subregisters of
@@ -341,10 +340,11 @@ void AggressiveAntiDepBreaker::HandleLastUse(unsigned Reg, unsigned KillIdx,
341
340
}
342
341
343
342
void AggressiveAntiDepBreaker::PrescanInstruction (
344
- MachineInstr &MI, unsigned Count, std::set<unsigned > &PassthruRegs) {
343
+ MachineInstr &MI, unsigned Count,
344
+ const std::set<MCRegister> &PassthruRegs) {
345
345
std::vector<unsigned > &DefIndices = State->GetDefIndices ();
346
- std::multimap<unsigned , AggressiveAntiDepState::RegisterReference>&
347
- RegRefs = State->GetRegRefs ();
346
+ std::multimap<MCRegister , AggressiveAntiDepState::RegisterReference>
347
+ & RegRefs = State->GetRegRefs ();
348
348
349
349
// Handle dead defs by simulating a last-use of the register just
350
350
// after the def. A dead def can occur because the def is truly
@@ -353,17 +353,19 @@ void AggressiveAntiDepBreaker::PrescanInstruction(
353
353
// previous def.
354
354
for (const MachineOperand &MO : MI.all_defs ()) {
355
355
Register Reg = MO.getReg ();
356
- if (Reg == 0 ) continue ;
356
+ if (!Reg)
357
+ continue ;
357
358
358
- HandleLastUse (Reg, Count + 1 , " " , " \t Dead Def: " , " \n " );
359
+ HandleLastUse (Reg. asMCReg () , Count + 1 , " " , " \t Dead Def: " , " \n " );
359
360
}
360
361
361
362
LLVM_DEBUG (dbgs () << " \t Def Groups:" );
362
363
for (unsigned i = 0 , e = MI.getNumOperands (); i != e; ++i) {
363
364
MachineOperand &MO = MI.getOperand (i);
364
365
if (!MO.isReg () || !MO.isDef ()) continue ;
365
366
Register Reg = MO.getReg ();
366
- if (Reg == 0 ) continue ;
367
+ if (!Reg)
368
+ continue ;
367
369
368
370
LLVM_DEBUG (dbgs () << " " << printReg (Reg, TRI) << " =g"
369
371
<< State->GetGroup (Reg));
@@ -382,7 +384,7 @@ void AggressiveAntiDepBreaker::PrescanInstruction(
382
384
// Any aliased that are live at this point are completely or
383
385
// partially defined here, so group those aliases with Reg.
384
386
for (MCRegAliasIterator AI (Reg, TRI, false ); AI.isValid (); ++AI) {
385
- unsigned AliasReg = *AI;
387
+ MCRegister AliasReg = *AI;
386
388
if (State->IsLive (AliasReg)) {
387
389
State->UnionGroups (Reg, AliasReg);
388
390
LLVM_DEBUG (dbgs () << " ->g" << State->GetGroup (Reg) << " (via "
@@ -404,7 +406,8 @@ void AggressiveAntiDepBreaker::PrescanInstruction(
404
406
// live-ranges.
405
407
for (const MachineOperand &MO : MI.all_defs ()) {
406
408
Register Reg = MO.getReg ();
407
- if (Reg == 0 ) continue ;
409
+ if (!Reg)
410
+ continue ;
408
411
// Ignore KILLs and passthru registers for liveness...
409
412
if (MI.isKill () || (PassthruRegs.count (Reg) != 0 ))
410
413
continue ;
@@ -428,8 +431,8 @@ void AggressiveAntiDepBreaker::PrescanInstruction(
428
431
void AggressiveAntiDepBreaker::ScanInstruction (MachineInstr &MI,
429
432
unsigned Count) {
430
433
LLVM_DEBUG (dbgs () << " \t Use Groups:" );
431
- std::multimap<unsigned , AggressiveAntiDepState::RegisterReference>&
432
- RegRefs = State->GetRegRefs ();
434
+ std::multimap<MCRegister , AggressiveAntiDepState::RegisterReference>
435
+ & RegRefs = State->GetRegRefs ();
433
436
434
437
// If MI's uses have special allocation requirement, don't allow
435
438
// any use registers to be changed. Also assume all registers
@@ -457,15 +460,16 @@ void AggressiveAntiDepBreaker::ScanInstruction(MachineInstr &MI,
457
460
MachineOperand &MO = MI.getOperand (i);
458
461
if (!MO.isReg () || !MO.isUse ()) continue ;
459
462
Register Reg = MO.getReg ();
460
- if (Reg == 0 ) continue ;
463
+ if (!Reg)
464
+ continue ;
461
465
462
466
LLVM_DEBUG (dbgs () << " " << printReg (Reg, TRI) << " =g"
463
467
<< State->GetGroup (Reg));
464
468
465
469
// It wasn't previously live but now it is, this is a kill. Forget
466
470
// the previous live-range information and start a new live-range
467
471
// for the register.
468
- HandleLastUse (Reg, Count, " (last-use)" );
472
+ HandleLastUse (Reg. asMCReg () , Count, " (last-use)" );
469
473
470
474
if (Special) {
471
475
LLVM_DEBUG (if (State->GetGroup (Reg) != 0 ) dbgs () << " ->g0(alloc-req)" );
@@ -487,13 +491,14 @@ void AggressiveAntiDepBreaker::ScanInstruction(MachineInstr &MI,
487
491
if (MI.isKill ()) {
488
492
LLVM_DEBUG (dbgs () << " \t Kill Group:" );
489
493
490
- unsigned FirstReg = 0 ;
494
+ Register FirstReg;
491
495
for (const MachineOperand &MO : MI.operands ()) {
492
496
if (!MO.isReg ()) continue ;
493
497
Register Reg = MO.getReg ();
494
- if (Reg == 0 ) continue ;
498
+ if (!Reg)
499
+ continue ;
495
500
496
- if (FirstReg != 0 ) {
501
+ if (FirstReg) {
497
502
LLVM_DEBUG (dbgs () << " =" << printReg (Reg, TRI));
498
503
State->UnionGroups (FirstReg, Reg);
499
504
} else {
@@ -506,7 +511,7 @@ void AggressiveAntiDepBreaker::ScanInstruction(MachineInstr &MI,
506
511
}
507
512
}
508
513
509
- BitVector AggressiveAntiDepBreaker::GetRenameRegisters (unsigned Reg) {
514
+ BitVector AggressiveAntiDepBreaker::GetRenameRegisters (MCRegister Reg) {
510
515
BitVector BV (TRI->getNumRegs (), false );
511
516
bool first = true ;
512
517
@@ -532,17 +537,17 @@ BitVector AggressiveAntiDepBreaker::GetRenameRegisters(unsigned Reg) {
532
537
}
533
538
534
539
bool AggressiveAntiDepBreaker::FindSuitableFreeRegisters (
535
- unsigned SuperReg, unsigned AntiDepGroupIndex, RenameOrderType &RenameOrder ,
536
- std::map<unsigned , unsigned > &RenameMap) {
540
+ MCRegister SuperReg, unsigned AntiDepGroupIndex,
541
+ RenameOrderType &RenameOrder, std::map<MCRegister, MCRegister > &RenameMap) {
537
542
std::vector<unsigned > &KillIndices = State->GetKillIndices ();
538
543
std::vector<unsigned > &DefIndices = State->GetDefIndices ();
539
- std::multimap<unsigned , AggressiveAntiDepState::RegisterReference>&
540
- RegRefs = State->GetRegRefs ();
544
+ std::multimap<MCRegister , AggressiveAntiDepState::RegisterReference>
545
+ & RegRefs = State->GetRegRefs ();
541
546
542
547
// Collect all referenced registers in the same group as
543
548
// AntiDepReg. These all need to be renamed together if we are to
544
549
// break the anti-dependence.
545
- std::vector<unsigned > Regs;
550
+ std::vector<MCRegister > Regs;
546
551
State->GetGroupRegs (AntiDepGroupIndex, Regs, &RegRefs);
547
552
assert (!Regs.empty () && " Empty register group!" );
548
553
if (Regs.empty ())
@@ -552,8 +557,8 @@ bool AggressiveAntiDepBreaker::FindSuitableFreeRegisters(
552
557
// each register.
553
558
LLVM_DEBUG (dbgs () << " \t Rename Candidates for Group g" << AntiDepGroupIndex
554
559
<< " :\n " );
555
- std::map<unsigned , BitVector> RenameRegisterMap;
556
- for (unsigned Reg : Regs) {
560
+ std::map<MCRegister , BitVector> RenameRegisterMap;
561
+ for (MCRegister Reg : Regs) {
557
562
// If Reg has any references, then collect possible rename regs
558
563
if (RegRefs.count (Reg) > 0 ) {
559
564
LLVM_DEBUG (dbgs () << " \t\t " << printReg (Reg, TRI) << " :" );
@@ -572,7 +577,7 @@ bool AggressiveAntiDepBreaker::FindSuitableFreeRegisters(
572
577
}
573
578
574
579
// All group registers should be a subreg of SuperReg.
575
- for (unsigned Reg : Regs) {
580
+ for (MCRegister Reg : Regs) {
576
581
if (Reg == SuperReg) continue ;
577
582
bool IsSub = TRI->isSubRegister (SuperReg, Reg);
578
583
// FIXME: remove this once PR18663 has been properly fixed. For now,
@@ -621,7 +626,7 @@ bool AggressiveAntiDepBreaker::FindSuitableFreeRegisters(
621
626
do {
622
627
if (R == 0 ) R = Order.size ();
623
628
--R;
624
- const unsigned NewSuperReg = Order[R];
629
+ const MCRegister NewSuperReg = Order[R];
625
630
// Don't consider non-allocatable registers
626
631
if (!MRI.isAllocatable (NewSuperReg)) continue ;
627
632
// Don't replace a register with itself.
@@ -633,8 +638,8 @@ bool AggressiveAntiDepBreaker::FindSuitableFreeRegisters(
633
638
// For each referenced group register (which must be a SuperReg or
634
639
// a subregister of SuperReg), find the corresponding subregister
635
640
// of NewSuperReg and make sure it is free to be renamed.
636
- for (unsigned Reg : Regs) {
637
- unsigned NewReg = 0 ;
641
+ for (MCRegister Reg : Regs) {
642
+ MCRegister NewReg;
638
643
if (Reg == SuperReg) {
639
644
NewReg = NewSuperReg;
640
645
} else {
@@ -661,7 +666,7 @@ bool AggressiveAntiDepBreaker::FindSuitableFreeRegisters(
661
666
} else {
662
667
bool found = false ;
663
668
for (MCRegAliasIterator AI (NewReg, TRI, false ); AI.isValid (); ++AI) {
664
- unsigned AliasReg = *AI;
669
+ MCRegister AliasReg = *AI;
665
670
if (State->IsLive (AliasReg) ||
666
671
(KillIndices[Reg] > DefIndices[AliasReg])) {
667
672
LLVM_DEBUG (dbgs ()
@@ -703,7 +708,7 @@ bool AggressiveAntiDepBreaker::FindSuitableFreeRegisters(
703
708
}
704
709
705
710
// Record that 'Reg' can be renamed to 'NewReg'.
706
- RenameMap.insert (std::pair< unsigned , unsigned > (Reg, NewReg));
711
+ RenameMap.insert (std::make_pair (Reg, NewReg));
707
712
}
708
713
709
714
// If we fall-out here, then every register in the group can be
@@ -733,8 +738,8 @@ unsigned AggressiveAntiDepBreaker::BreakAntiDependencies(
733
738
DbgValueVector &DbgValues) {
734
739
std::vector<unsigned > &KillIndices = State->GetKillIndices ();
735
740
std::vector<unsigned > &DefIndices = State->GetDefIndices ();
736
- std::multimap<unsigned , AggressiveAntiDepState::RegisterReference>&
737
- RegRefs = State->GetRegRefs ();
741
+ std::multimap<MCRegister , AggressiveAntiDepState::RegisterReference>
742
+ & RegRefs = State->GetRegRefs ();
738
743
739
744
// The code below assumes that there is at least one instruction,
740
745
// so just duck out immediately if the block is empty.
@@ -792,7 +797,7 @@ unsigned AggressiveAntiDepBreaker::BreakAntiDependencies(
792
797
LLVM_DEBUG (dbgs () << " Anti: " );
793
798
LLVM_DEBUG (MI.dump ());
794
799
795
- std::set<unsigned > PassthruRegs;
800
+ std::set<MCRegister > PassthruRegs;
796
801
GetPassthruRegs (MI, PassthruRegs);
797
802
798
803
// Process the defs in MI...
@@ -824,15 +829,15 @@ unsigned AggressiveAntiDepBreaker::BreakAntiDependencies(
824
829
if ((Edge->getKind () != SDep::Anti) &&
825
830
(Edge->getKind () != SDep::Output)) continue ;
826
831
827
- unsigned AntiDepReg = Edge->getReg ();
832
+ MCRegister AntiDepReg = MCRegister::from ( Edge->getReg () );
828
833
LLVM_DEBUG (dbgs () << " \t Antidep reg: " << printReg (AntiDepReg, TRI));
829
- assert (AntiDepReg != 0 && " Anti-dependence on reg0?" );
834
+ assert (AntiDepReg && " Anti-dependence on reg0?" );
830
835
831
836
if (!MRI.isAllocatable (AntiDepReg)) {
832
837
// Don't break anti-dependencies on non-allocatable registers.
833
838
LLVM_DEBUG (dbgs () << " (non-allocatable)\n " );
834
839
continue ;
835
- } else if (ExcludeRegs && ExcludeRegs->test (AntiDepReg)) {
840
+ } else if (ExcludeRegs && ExcludeRegs->test (AntiDepReg. id () )) {
836
841
// Don't break anti-dependencies for critical path registers
837
842
// if not on the critical path
838
843
LLVM_DEBUG (dbgs () << " (not critical-path)\n " );
@@ -867,30 +872,30 @@ unsigned AggressiveAntiDepBreaker::BreakAntiDependencies(
867
872
Pred.getReg () != AntiDepReg)
868
873
: (Pred.getKind () == SDep::Data &&
869
874
Pred.getReg () == AntiDepReg)) {
870
- AntiDepReg = 0 ;
875
+ AntiDepReg = MCRegister () ;
871
876
break ;
872
877
}
873
878
}
874
879
for (const SDep &Pred : PathSU->Preds ) {
875
880
if ((Pred.getSUnit () == NextSU) && (Pred.getKind () != SDep::Anti) &&
876
881
(Pred.getKind () != SDep::Output)) {
877
882
LLVM_DEBUG (dbgs () << " (real dependency)\n " );
878
- AntiDepReg = 0 ;
883
+ AntiDepReg = MCRegister () ;
879
884
break ;
880
885
} else if ((Pred.getSUnit () != NextSU) &&
881
886
(Pred.getKind () == SDep::Data) &&
882
887
(Pred.getReg () == AntiDepReg)) {
883
888
LLVM_DEBUG (dbgs () << " (other dependency)\n " );
884
- AntiDepReg = 0 ;
889
+ AntiDepReg = MCRegister () ;
885
890
break ;
886
891
}
887
892
}
888
893
889
- if (AntiDepReg == 0 )
894
+ if (! AntiDepReg)
890
895
continue ;
891
896
}
892
897
893
- assert (AntiDepReg != 0 );
898
+ assert (AntiDepReg);
894
899
895
900
// Determine AntiDepReg's register group.
896
901
const unsigned GroupIndex = State->GetGroup (AntiDepReg);
@@ -902,16 +907,16 @@ unsigned AggressiveAntiDepBreaker::BreakAntiDependencies(
902
907
LLVM_DEBUG (dbgs () << ' \n ' );
903
908
904
909
// Look for a suitable register to use to break the anti-dependence.
905
- std::map<unsigned , unsigned > RenameMap;
910
+ std::map<MCRegister, MCRegister > RenameMap;
906
911
if (FindSuitableFreeRegisters (AntiDepReg, GroupIndex, RenameOrder,
907
912
RenameMap)) {
908
913
LLVM_DEBUG (dbgs () << " \t Breaking anti-dependence edge on "
909
914
<< printReg (AntiDepReg, TRI) << " :" );
910
915
911
916
// Handle each group register...
912
917
for (const auto &P : RenameMap) {
913
- unsigned CurrReg = P.first ;
914
- unsigned NewReg = P.second ;
918
+ MCRegister CurrReg = P.first ;
919
+ MCRegister NewReg = P.second ;
915
920
916
921
LLVM_DEBUG (dbgs () << " " << printReg (CurrReg, TRI) << " ->"
917
922
<< printReg (NewReg, TRI) << " ("
0 commit comments