diff options
author | Kazu Hirata <kazu@google.com> | 2021-01-10 14:32:02 -0800 |
---|---|---|
committer | Kazu Hirata <kazu@google.com> | 2021-01-10 14:32:02 -0800 |
commit | 407b1e65a464081e28c325273b65e8eafdfad1d4 (patch) | |
tree | 1f83237968cd7ddbff5c8dda5509c2f3c7bd5a18 /llvm/lib/CodeGen/MachineBasicBlock.cpp | |
parent | 7be3285248bf54d0784a76174cf44cf7c1e780a5 (diff) | |
download | llvm-407b1e65a464081e28c325273b65e8eafdfad1d4.zip llvm-407b1e65a464081e28c325273b65e8eafdfad1d4.tar.gz llvm-407b1e65a464081e28c325273b65e8eafdfad1d4.tar.bz2 |
[StringExtras] Add a helper class for comma-separated lists
This patch introduces a helper class SubsequentDelim to simplify loops
that generate a comma-separated lists.
For example, consider the following loop, taken from
llvm/lib/CodeGen/MachineBasicBlock.cpp:
for (auto I = pred_begin(), E = pred_end(); I != E; ++I) {
if (I != pred_begin())
OS << ", ";
OS << printMBBReference(**I);
}
The new class allows us to rewrite the loop as:
SubsequentDelim SD;
for (auto I = pred_begin(), E = pred_end(); I != E; ++I)
OS << SD << printMBBReference(**I);
where SD evaluates to the empty string for the first time and ", " for
subsequent iterations.
Unlike interleaveComma, defined in llvm/include/llvm/ADT/STLExtras.h,
SubsequentDelim can accommodate a wider variety of loops, including:
- those that conditionally skip certain items,
- those that need iterators to call getSuccProbability(I), and
- those that iterate over integer ranges.
As an example, this patch cleans up MachineBasicBlock::print.
Differential Revision: https://reviews.llvm.org/D94377
Diffstat (limited to 'llvm/lib/CodeGen/MachineBasicBlock.cpp')
-rw-r--r-- | llvm/lib/CodeGen/MachineBasicBlock.cpp | 25 |
1 files changed, 9 insertions, 16 deletions
diff --git a/llvm/lib/CodeGen/MachineBasicBlock.cpp b/llvm/lib/CodeGen/MachineBasicBlock.cpp index 14a270f..c7b404e 100644 --- a/llvm/lib/CodeGen/MachineBasicBlock.cpp +++ b/llvm/lib/CodeGen/MachineBasicBlock.cpp @@ -353,11 +353,9 @@ void MachineBasicBlock::print(raw_ostream &OS, ModuleSlotTracker &MST, if (Indexes) OS << '\t'; // Don't indent(2), align with previous line attributes. OS << "; predecessors: "; - for (auto I = pred_begin(), E = pred_end(); I != E; ++I) { - if (I != pred_begin()) - OS << ", "; - OS << printMBBReference(**I); - } + SubsequentDelim SD; + for (auto *Pred : predecessors()) + OS << SD << printMBBReference(*Pred); OS << '\n'; HasLineAttributes = true; } @@ -366,10 +364,9 @@ void MachineBasicBlock::print(raw_ostream &OS, ModuleSlotTracker &MST, if (Indexes) OS << '\t'; // Print the successors OS.indent(2) << "successors: "; + SubsequentDelim SD; for (auto I = succ_begin(), E = succ_end(); I != E; ++I) { - if (I != succ_begin()) - OS << ", "; - OS << printMBBReference(**I); + OS << SD << printMBBReference(**I); if (!Probs.empty()) OS << '(' << format("0x%08" PRIx32, getSuccProbability(I).getNumerator()) @@ -378,11 +375,10 @@ void MachineBasicBlock::print(raw_ostream &OS, ModuleSlotTracker &MST, if (!Probs.empty() && IsStandalone) { // Print human readable probabilities as comments. OS << "; "; + SubsequentDelim SD; for (auto I = succ_begin(), E = succ_end(); I != E; ++I) { const BranchProbability &BP = getSuccProbability(I); - if (I != succ_begin()) - OS << ", "; - OS << printMBBReference(**I) << '(' + OS << SD << printMBBReference(**I) << '(' << format("%.2f%%", rint(((double)BP.getNumerator() / BP.getDenominator()) * 100.0 * 100.0) / @@ -399,12 +395,9 @@ void MachineBasicBlock::print(raw_ostream &OS, ModuleSlotTracker &MST, if (Indexes) OS << '\t'; OS.indent(2) << "liveins: "; - bool First = true; + SubsequentDelim SD; for (const auto &LI : liveins()) { - if (!First) - OS << ", "; - First = false; - OS << printReg(LI.PhysReg, TRI); + OS << SD << printReg(LI.PhysReg, TRI); if (!LI.LaneMask.all()) OS << ":0x" << PrintLaneMask(LI.LaneMask); } |