[reduce] Improve reduction summary display

Improve the progress summary printed by `circt-reduce` by making it
actually end in a newline, adding additional information, and properly
overwriting the previous summary if no other output has been printed in
the meantime.
This commit is contained in:
Fabian Schuiki 2022-07-07 15:14:09 +02:00
parent de1a55f3e9
commit 5665ac7d90
No known key found for this signature in database
GPG Key ID: C42F5825FC5275E6
1 changed files with 40 additions and 11 deletions

View File

@ -159,6 +159,15 @@ static LogicalResult execute(MLIRContext &context) {
auto bestSize = initialTest.getSize();
VERBOSE(llvm::errs() << "Initial module has size " << bestSize << "\n");
// Mechanism to write over the previous summary line, if it was the last
// thing written to errs.
size_t errsPosAfterLastSummary = 0;
auto clearSummary = [&] {
if (llvm::errs().tell() != errsPosAfterLastSummary)
return;
llvm::errs() << "\e[1A\e[2K"; // move up one line ("1A"), clear line ("2K")
};
// Iteratively reduce the input module by applying the current reduction
// pattern to successively smaller subsets of the operations until we find one
// that retains the interesting behavior.
@ -172,11 +181,15 @@ static LogicalResult execute(MLIRContext &context) {
++patternIdx;
continue;
}
VERBOSE(llvm::errs() << "Trying reduction `" << pattern.getName() << "`\n");
VERBOSE({
clearSummary();
llvm::errs() << "Trying reduction `" << pattern.getName() << "`\n";
});
size_t rangeBase = 0;
size_t rangeLength = -1;
bool patternDidReduce = false;
bool allDidReduce = true;
while (rangeLength > 0) {
// Apply the pattern to the subset of operations selected by `rangeBase`
// and `rangeLength`.
@ -193,7 +206,10 @@ static LogicalResult execute(MLIRContext &context) {
});
pattern.afterReduction(*newModule);
if (opIdx == 0) {
VERBOSE(llvm::errs() << "- No more ops where the pattern applies\n");
VERBOSE({
clearSummary();
llvm::errs() << "- No more ops where the pattern applies\n";
});
break;
}
@ -201,9 +217,13 @@ static LogicalResult execute(MLIRContext &context) {
VERBOSE({
size_t boundLength = std::min(rangeLength, opIdx);
size_t numDone = rangeBase / boundLength + 1;
size_t numTotal = opIdx / boundLength;
size_t numTotal = (opIdx + boundLength - 1) / boundLength;
clearSummary();
llvm::errs() << " [" << numDone << "/" << numTotal << "; "
<< (numDone * 100 / numTotal) << "%]\r";
<< (numDone * 100 / numTotal) << "%; " << opIdx << " ops, "
<< boundLength << " at once; " << pattern.getName()
<< "]\n";
errsPosAfterLastSummary = llvm::errs().tell();
});
// Check if this reduced module is still interesting, and its overall size
@ -222,8 +242,10 @@ static LogicalResult execute(MLIRContext &context) {
// have created additional opportunities.
patternDidReduce = true;
bestSize = test.getSize();
VERBOSE(llvm::errs()
<< "- Accepting module of size " << bestSize << "\n");
VERBOSE({
clearSummary();
llvm::errs() << "- Accepting module of size " << bestSize << "\n";
});
module = std::move(newModule);
// We leave `rangeBase` and `rangeLength` untouched in this case. This
@ -259,9 +281,12 @@ static LogicalResult execute(MLIRContext &context) {
} else {
rangeLength = std::min(rangeLength, opIdx) / 2;
rangeBase = 0;
if (rangeLength > 0)
VERBOSE(llvm::errs()
<< "- Trying " << rangeLength << " ops at once\n");
if (rangeLength > 0) {
VERBOSE({
clearSummary();
llvm::errs() << "- Trying " << rangeLength << " ops at once\n";
});
}
}
}
}
@ -275,8 +300,11 @@ static LogicalResult execute(MLIRContext &context) {
// pattern again, since we might have uncovered additional reduction
// opportunities. Otherwise we just keep going to try the next pattern.
if (patternDidReduce && patternIdx > 0) {
VERBOSE(llvm::errs() << "- Reduction `" << pattern.getName()
<< "` was successful, starting at the top\n\n");
VERBOSE({
clearSummary();
llvm::errs() << "- Reduction `" << pattern.getName()
<< "` was successful, starting at the top\n\n";
});
patternIdx = 0;
} else {
++patternIdx;
@ -284,6 +312,7 @@ static LogicalResult execute(MLIRContext &context) {
}
// Write the reduced test case to the output.
clearSummary();
VERBOSE(llvm::errs() << "All reduction strategies exhausted\n");
VERBOSE(llvm::errs() << "Final size: " << bestSize << " ("
<< (100 - bestSize * 100 / initialTest.getSize())