@@ -652,19 +652,23 @@ LLVM_DUMP_METHOD void StackColoring::dumpIntervals() const {
652652
653653LLVM_DUMP_METHOD void StackColoring::SlotInfo::dump (const StackColoring* State) const {
654654 unsigned Slot = InvalidIdx;
655- if (State)
655+ if (State) {
656656 Slot = this - State->Slot2Info .data ();
657+ dbgs () << " fi#" << Slot;
658+ } else
657659 dbgs () << " SlotInfo" ;
658- if (State)
659- dbgs () << " ( " << Slot << " ) " ;
660- dbgs ()<< " : " ;
661- dbgs () << ' \n ' ;
662- if (State)
663- if ( State->MFI ->getObjectAllocation (Slot)) {
664- State->MFI ->getObjectAllocation (Slot)-> print ( dbgs ());
665- dbgs () << ' \n ' ;
660+ dbgs () << " : " ;
661+ if (Offset != InvalidIdx)
662+ dbgs () << " offset= " << Offset ;
663+ if (State) {
664+ if (State-> MFI -> getObjectAllocation (Slot) )
665+ dbgs () << " \" " << State->MFI ->getObjectAllocation (Slot)-> getName () << " \" " ;
666+ if ( State->MFI ->isSpillSlotObjectIndex (Slot))
667+ dbgs () << " spill " ;
666668 }
667- dbgs () << " Size=" << Size << " Align=" << Align.value () << ' \n ' ;
669+ dbgs () << " size=" << Size << " align=" << Align.value () << ' \n ' ;
670+ if (IndexBasedLiveRange)
671+ dbgs () << " Index: " << *IndexBasedLiveRange << " \n " ;
668672 dumpBV (" LIVENESS " , Liveness);
669673 BitVector Start;
670674 Start.resize (Liveness.size ());
@@ -1607,7 +1611,7 @@ unsigned StackColoring::doMerging(unsigned NumSlots) {
16071611 LatestStatus.resize (LivenessSize, Status{});
16081612 SmallVector<Status> OlderStatus;
16091613
1610- auto FindOffset = [&](SlotInfo &Info, unsigned Pt) {
1614+ auto FindStatus = [&](SlotInfo &Info, unsigned Pt) -> Status& {
16111615 Status *Last = &LatestStatus[Pt];
16121616
16131617 // The slots in the linked-list are always kept in ascending order, so the
@@ -1617,9 +1621,9 @@ unsigned StackColoring::doMerging(unsigned NumSlots) {
16171621 while (LLVM_UNLIKELY (Last->Slot != InvalidIdx &&
16181622 !HasOverlapCached (Info, Slot2Info[Last->Slot ])))
16191623 Last = &OlderStatus[Last->Prev ];
1620- return Last-> Offset ;
1624+ return * Last;
16211625 };
1622- auto UpdateOffset = [&](SlotInfo &Info, unsigned Pt, unsigned Offset) {
1626+ auto UpdateStatus = [&](SlotInfo &Info, unsigned Pt, unsigned Offset) {
16231627 Status* Last = &LatestStatus[Pt];
16241628 unsigned Idx = OlderStatus.size ();
16251629 OlderStatus.push_back (*Last);
@@ -1656,16 +1660,25 @@ unsigned StackColoring::doMerging(unsigned NumSlots) {
16561660 Candidates.push_back (SlotStack.pop_back_val ());
16571661 }
16581662
1663+ LLVM_DEBUG (dbgs () << " \n Starting Placement:\n " );
16591664 unsigned WorseCaseOffset = 0 ;
16601665 while (!Candidates.empty ()) {
16611666 unsigned BestIdx = InvalidIdx;
16621667 unsigned BestOffset = InvalidIdx;
16631668
1669+ LLVM_DEBUG (dbgs () << " top=" << WorseCaseOffset << " choosing: " );
16641670 for (unsigned K = 0 ; K < Candidates.size (); K++) {
16651671 SlotInfo &Info = Slot2Info[Candidates[K]];
16661672 unsigned Offset = 0 ;
1673+ unsigned PrevSlot = InvalidIdx;
1674+ (void )PrevSlot; // Only use in LLVM_DEBUG
1675+
16671676 for (unsigned Pt : Info.Liveness .set_bits ()) {
1668- Offset = std::max (Offset, FindOffset (Info, Pt));
1677+ Status S = FindStatus (Info, Pt);
1678+ if (S.Offset > Offset) {
1679+ PrevSlot = S.Slot ;
1680+ Offset = S.Offset ;
1681+ }
16691682
16701683 // If Offset == WorseCaseOffset, this is always a valid, options. so no
16711684 // more checking needed
@@ -1677,7 +1690,10 @@ unsigned StackColoring::doMerging(unsigned NumSlots) {
16771690
16781691 Offset = alignTo (Offset, Info.Align );
16791692
1680- LLVM_DEBUG (dbgs () << " choice: SlotInfo(" << Candidates[K] << " ) at " << Offset << " \n " );
1693+ LLVM_DEBUG (dbgs () << " fi#" << Candidates[K] << " @" << Offset << " ->" ;
1694+ if (PrevSlot == InvalidIdx) dbgs () << " bottom" ;
1695+ else dbgs () << " fi#" << PrevSlot; dbgs () << " , " ;);
1696+
16811697 bool IsBetter = [&] {
16821698 if (BestOffset != Offset)
16831699 return BestOffset > Offset;
@@ -1699,15 +1715,15 @@ unsigned StackColoring::doMerging(unsigned NumSlots) {
16991715 }
17001716 }
17011717 SlotInfo &Info = Slot2Info[Candidates[BestIdx]];
1718+ Info.Offset = BestOffset;
1719+ WorseCaseOffset = std::max (WorseCaseOffset, BestOffset + Info.Size );
17021720
1721+ LLVM_DEBUG (dbgs () << " \n " );
1722+ LLVM_DEBUG (dbgs () << " Placing: " );
17031723 LLVM_DEBUG (Info.dump (this ));
1704- LLVM_DEBUG (dbgs () << " Placing SlotInfo(" << Candidates[BestIdx] << " ) at "
1705- << BestOffset << " \n " );
17061724
1707- Info.Offset = BestOffset;
1708- WorseCaseOffset = std::max (WorseCaseOffset, BestOffset + Info.Size );
17091725 for (unsigned Pt : Info.Liveness .set_bits ())
1710- UpdateOffset (Info, Pt, BestOffset + Info.Size );
1726+ UpdateStatus (Info, Pt, BestOffset + Info.Size );
17111727#ifdef EXPENSIVE_CHECKS
17121728 // Validate the order of offsets in the linked-list
17131729 for (Status &S : LatestStatus) {
@@ -1786,13 +1802,9 @@ bool StackColoring::run(MachineFunction &Func) {
17861802 unsigned TotalSize = 0 ;
17871803 LLVM_DEBUG (dbgs () << " Found " << NumMarkers << " markers and " << NumSlots
17881804 << " slots\n " );
1789- LLVM_DEBUG (dbgs () << " Slot structure:\n " );
17901805
1791- for (int i=0 ; i < MFI->getObjectIndexEnd (); ++i) {
1792- LLVM_DEBUG (dbgs () << " Slot #" << i << " - " << MFI->getObjectSize (i)
1793- << " bytes.\n " );
1806+ for (int i=0 ; i < MFI->getObjectIndexEnd (); ++i)
17941807 TotalSize += MFI->getObjectSize (i);
1795- }
17961808
17971809 LLVM_DEBUG (dbgs () << " Total Stack size: " << TotalSize << " bytes\n\n " );
17981810
0 commit comments