Skip to content

Commit

Permalink
Reverse subregister saved loops in register usage info collector; NFC
Browse files Browse the repository at this point in the history
On AMDGPU we have 70 register classes, so iterating over all 70
each time and exiting is costly on the CPU, this flips the loop
around so that it loops over the 70 register classes first,
and exits without doing the inner loop if needed.

On my test just starting radv this takes
RegUsageInfoCollector::runOnMachineFunction
from 6.0% of total time to 2.7% of total time,
and reduces the startup from 2.24s to 2.19s

Patch by David Airlie!

Differential Revision: https://reviews.llvm.org/D48582

llvm-svn: 340993
  • Loading branch information
MatzeB committed Aug 29, 2018
1 parent d0ab67f commit b7b5860
Showing 1 changed file with 22 additions and 23 deletions.
45 changes: 22 additions & 23 deletions llvm/lib/CodeGen/RegUsageInfoCollector.cpp
Expand Up @@ -166,28 +166,27 @@ computeCalleeSavedRegs(BitVector &SavedRegs, MachineFunction &MF) {
}

// Insert any register fully saved via subregisters.
for (unsigned PReg = 1, PRegE = TRI.getNumRegs(); PReg < PRegE; ++PReg) {
if (SavedRegs.test(PReg))
continue;

// Check if PReg is fully covered by its subregs.
bool CoveredBySubRegs = false;
for (const TargetRegisterClass *RC : TRI.regclasses())
if (RC->CoveredBySubRegs && RC->contains(PReg)) {
CoveredBySubRegs = true;
break;
}
if (!CoveredBySubRegs)
continue;

// Add PReg to SavedRegs if all subregs are saved.
bool AllSubRegsSaved = true;
for (MCSubRegIterator SR(PReg, &TRI, false); SR.isValid(); ++SR)
if (!SavedRegs.test(*SR)) {
AllSubRegsSaved = false;
break;
}
if (AllSubRegsSaved)
SavedRegs.set(PReg);
for (const TargetRegisterClass *RC : TRI.regclasses()) {
if (!RC->CoveredBySubRegs)
continue;

for (unsigned PReg = 1, PRegE = TRI.getNumRegs(); PReg < PRegE; ++PReg) {
if (SavedRegs.test(PReg))
continue;

// Check if PReg is fully covered by its subregs.
if (!RC->contains(PReg))
continue;

// Add PReg to SavedRegs if all subregs are saved.
bool AllSubRegsSaved = true;
for (MCSubRegIterator SR(PReg, &TRI, false); SR.isValid(); ++SR)
if (!SavedRegs.test(*SR)) {
AllSubRegsSaved = false;
break;
}
if (AllSubRegsSaved)
SavedRegs.set(PReg);
}
}
}

0 comments on commit b7b5860

Please sign in to comment.