diff --git a/bolt/include/bolt/Passes/DataflowAnalysis.h b/bolt/include/bolt/Passes/DataflowAnalysis.h --- a/bolt/include/bolt/Passes/DataflowAnalysis.h +++ b/bolt/include/bolt/Passes/DataflowAnalysis.h @@ -341,12 +341,11 @@ } } } else { - for (auto I = Func.rbegin(), E = Func.rend(); I != E; ++I) { - Worklist.push(&*I); + for (BinaryBasicBlock &BB : llvm::reverse(Func)) { + Worklist.push(&BB); MCInst *Prev = nullptr; - for (auto J = (*I).rbegin(), E2 = (*I).rend(); J != E2; ++J) { - MCInst &Inst = *J; - PrevPoint[&Inst] = Prev ? ProgramPoint(Prev) : ProgramPoint(&*I); + for (MCInst &Inst : llvm::reverse(BB)) { + PrevPoint[&Inst] = Prev ? ProgramPoint(Prev) : ProgramPoint(&BB); Prev = &Inst; } } @@ -417,8 +416,8 @@ for (MCInst &Inst : *BB) doNext(Inst, *BB); else - for (auto I = BB->rbegin(), E = BB->rend(); I != E; ++I) - doNext(*I, *BB); + for (MCInst &Inst : llvm::reverse(*BB)) + doNext(Inst, *BB); if (Changed) { if (!Backward) { diff --git a/bolt/lib/Core/BinaryBasicBlock.cpp b/bolt/lib/Core/BinaryBasicBlock.cpp --- a/bolt/lib/Core/BinaryBasicBlock.cpp +++ b/bolt/lib/Core/BinaryBasicBlock.cpp @@ -198,14 +198,13 @@ // Find the last CFI preceding Instr in this basic block. const MCInst *LastCFI = nullptr; bool InstrSeen = (Instr == nullptr); - for (auto RII = Instructions.rbegin(), E = Instructions.rend(); RII != E; - ++RII) { + for (const MCInst &Inst : llvm::reverse(Instructions)) { if (!InstrSeen) { - InstrSeen = (&*RII == Instr); + InstrSeen = (&Inst == Instr); continue; } - if (Function->getBinaryContext().MIB->isCFI(*RII)) { - LastCFI = &*RII; + if (Function->getBinaryContext().MIB->isCFI(Inst)) { + LastCFI = &Inst; break; } } diff --git a/bolt/lib/Core/BinaryFunction.cpp b/bolt/lib/Core/BinaryFunction.cpp --- a/bolt/lib/Core/BinaryFunction.cpp +++ b/bolt/lib/Core/BinaryFunction.cpp @@ -792,8 +792,9 @@ // Start at the last label as an approximation of the current basic block. // This is a heuristic, since the full set of labels have yet to be // determined - for (auto LI = Labels.rbegin(); LI != Labels.rend(); ++LI) { - auto II = Instructions.find(LI->first); + for (const uint32_t Offset : + llvm::make_first_range(llvm::reverse(Labels))) { + auto II = Instructions.find(Offset); if (II != Instructions.end()) { Begin = II; break; @@ -2658,10 +2659,10 @@ } // Replay instructions while avoiding duplicates - for (auto I = NewCFIs.rbegin(), E = NewCFIs.rend(); I != E; ++I) { - if (CFIDiff.isRedundant(FrameInstructions[*I])) + for (int32_t State : llvm::reverse(NewCFIs)) { + if (CFIDiff.isRedundant(FrameInstructions[State])) continue; - InsertIt = addCFIPseudo(InBB, InsertIt, *I); + InsertIt = addCFIPseudo(InBB, InsertIt, State); } return true; diff --git a/bolt/lib/Core/DebugData.cpp b/bolt/lib/Core/DebugData.cpp --- a/bolt/lib/Core/DebugData.cpp +++ b/bolt/lib/Core/DebugData.cpp @@ -1234,13 +1234,12 @@ if (Patch != UnitPatches.end()) { bool Patched = false; // Patches added later take a precedence over earlier ones. - for (auto I = Patch->second.rbegin(), E = Patch->second.rend(); I != E; - ++I) { - if (I->OldAttr != AttrSpec.Attr) + for (const PatchInfo &PI : llvm::reverse(Patch->second)) { + if (PI.OldAttr != AttrSpec.Attr) continue; - encodeULEB128(I->NewAttr, OS); - encodeULEB128(I->NewAttrForm, OS); + encodeULEB128(PI.NewAttr, OS); + encodeULEB128(PI.NewAttrForm, OS); Patched = true; break; } diff --git a/bolt/lib/Core/DynoStats.cpp b/bolt/lib/Core/DynoStats.cpp --- a/bolt/lib/Core/DynoStats.cpp +++ b/bolt/lib/Core/DynoStats.cpp @@ -111,17 +111,15 @@ // Dump in ascending order: Start with Opcode with Highest execution // count. - for (auto Stat = SortedHistogram.rbegin(); Stat != SortedHistogram.rend(); - ++Stat) { - OS << format("%20s,%'18lld", Printer->getOpcodeName(Stat->second).data(), - Stat->first * opts::DynoStatsScale); + for (auto &Stat : llvm::reverse(SortedHistogram)) { + OS << format("%20s,%'18lld", Printer->getOpcodeName(Stat.second).data(), + Stat.first * opts::DynoStatsScale); - MaxOpcodeHistogramTy MaxMultiMap = - OpcodeHistogram.at(Stat->second).second; + MaxOpcodeHistogramTy MaxMultiMap = OpcodeHistogram.at(Stat.second).second; // Start with function name:BB offset with highest execution count. - for (auto Max = MaxMultiMap.rbegin(); Max != MaxMultiMap.rend(); ++Max) { - OS << format(", %'18lld, ", Max->first * opts::DynoStatsScale) - << Max->second.first.str() << ':' << Max->second.second; + for (auto &Max : llvm::reverse(MaxMultiMap)) { + OS << format(", %'18lld, ", Max.first * opts::DynoStatsScale) + << Max.second.first.str() << ':' << Max.second.second; } OS << '\n'; } @@ -145,14 +143,14 @@ auto &OtherMMap = Stat.second.second; auto Size = MMap.size(); assert(Size <= opts::PrintDynoOpcodeStat); - for (auto Iter = OtherMMap.rbegin(); Iter != OtherMMap.rend(); ++Iter) { + for (auto OtherMMapPair : llvm::reverse(OtherMMap)) { if (Size++ >= opts::PrintDynoOpcodeStat) { auto First = MMap.begin(); - if (Iter->first <= First->first) + if (OtherMMapPair.first <= First->first) break; MMap.erase(First); } - MMap.emplace(*Iter); + MMap.emplace(OtherMMapPair); } } } diff --git a/bolt/lib/Passes/AllocCombiner.cpp b/bolt/lib/Passes/AllocCombiner.cpp --- a/bolt/lib/Passes/AllocCombiner.cpp +++ b/bolt/lib/Passes/AllocCombiner.cpp @@ -69,8 +69,7 @@ BinaryContext &BC = BF.getBinaryContext(); for (BinaryBasicBlock &BB : BF) { MCInst *Prev = nullptr; - for (auto I = BB.rbegin(), E = BB.rend(); I != E; ++I) { - MCInst &Inst = *I; + for (MCInst &Inst : llvm::reverse(BB)) { if (isIndifferentToSP(Inst, BC)) continue; // Skip updating Prev diff --git a/bolt/lib/Passes/FrameOptimizer.cpp b/bolt/lib/Passes/FrameOptimizer.cpp --- a/bolt/lib/Passes/FrameOptimizer.cpp +++ b/bolt/lib/Passes/FrameOptimizer.cpp @@ -171,8 +171,7 @@ for (BinaryBasicBlock &BB : BF) { LLVM_DEBUG(dbgs() << "\tNow at BB " << BB.getName() << "\n"); const MCInst *Prev = nullptr; - for (auto I = BB.rbegin(), E = BB.rend(); I != E; ++I) { - MCInst &Inst = *I; + for (MCInst &Inst : llvm::reverse(BB)) { LLVM_DEBUG({ dbgs() << "\t\tNow at "; Inst.dump(); diff --git a/bolt/lib/Passes/ShrinkWrapping.cpp b/bolt/lib/Passes/ShrinkWrapping.cpp --- a/bolt/lib/Passes/ShrinkWrapping.cpp +++ b/bolt/lib/Passes/ShrinkWrapping.cpp @@ -124,8 +124,7 @@ // Now compute all restores of these callee-saved regs for (BinaryBasicBlock &BB : BF) { const MCInst *Prev = nullptr; - for (auto I = BB.rbegin(), E = BB.rend(); I != E; ++I) { - MCInst &Inst = *I; + for (MCInst &Inst : llvm::reverse(BB)) { if (ErrorOr FIE = FA.getFIEFor(Inst)) { if (!FIE->IsLoad || !CalleeSaved[FIE->RegOrImm]) { Prev = &Inst; @@ -321,8 +320,7 @@ for (BinaryBasicBlock &BB : BF) { const MCInst *Prev = nullptr; - for (auto I = BB.rbegin(), E = BB.rend(); I != E; ++I) { - MCInst &Inst = *I; + for (MCInst &Inst : llvm::reverse(BB)) { checkFramePointerInitialization(Inst); checkStackPointerRestore(Inst); ErrorOr FIEX = FA.getFIEFor(Inst); @@ -628,8 +626,7 @@ void StackLayoutModifier::performChanges() { std::set ModifiedCFIIndices; for (BinaryBasicBlock &BB : BF) { - for (auto I = BB.rbegin(), E = BB.rend(); I != E; ++I) { - MCInst &Inst = *I; + for (MCInst &Inst : llvm::reverse(BB)) { if (BC.MIB->hasAnnotation(Inst, "AccessesDeletedPos")) { assert(BC.MIB->isPop(Inst) || BC.MIB->isPush(Inst)); BC.MIB->removeAnnotation(Inst, "AccessesDeletedPos"); @@ -1124,13 +1121,13 @@ continue; } } - for (auto RIt = BB->rbegin(), End = BB->rend(); RIt != End; ++RIt) { - if (SPT.getStateBefore(*RIt)->first == SaveOffset) { - BitVector BV = *RI.getStateAt(*RIt); + for (MCInst &Inst : llvm::reverse(*BB)) { + if (SPT.getStateBefore(Inst)->first == SaveOffset) { + BitVector BV = *RI.getStateAt(Inst); BV &= UsesByReg[CSR]; if (!BV.any()) { Found = true; - PP = &*RIt; + PP = &Inst; break; } } @@ -1152,8 +1149,7 @@ for (BinaryBasicBlock *BB : BF.getLayout().blocks()) { std::vector CFIs; - for (auto I = BB->rbegin(), E = BB->rend(); I != E; ++I) { - MCInst &Inst = *I; + for (MCInst &Inst : llvm::reverse(*BB)) { if (BC.MIB->isCFI(Inst)) { // Delete all offset CFIs related to this CSR if (SLM.getOffsetCFIReg(Inst) == CSR) { @@ -1356,8 +1352,7 @@ if (Item.Action == WorklistItem::InsertPushOrPop) Item.Action = WorklistItem::InsertLoadOrStore; } - for (auto I = BB.rbegin(), E = BB.rend(); I != E; ++I) { - MCInst &Inst = *I; + for (MCInst &Inst : llvm::reverse(BB)) { auto TodoList = BC.MIB->tryGetAnnotationAs>( Inst, getAnnotationIndex()); if (!TodoList) @@ -1433,8 +1428,7 @@ BinaryBasicBlock &BB = *Iter; if (!BB.getName().startswith(".LSplitEdge")) continue; - for (auto RIter = BF.rbegin(); RIter != BF.rend(); ++RIter) { - BinaryBasicBlock &RBB = *RIter; + for (BinaryBasicBlock &RBB : llvm::reverse(BF)) { if (&RBB == &BB) break; if (!RBB.getName().startswith(".LSplitEdge") || !RBB.isValid() || @@ -1543,8 +1537,7 @@ int SPValPop) { MCInst *SavePoint = nullptr; for (BinaryBasicBlock &BB : BF) { - for (auto InstIter = BB.rbegin(), EndIter = BB.rend(); InstIter != EndIter; - ++InstIter) { + for (MCInst &Inst : llvm::reverse(BB)) { int32_t SrcImm = 0; MCPhysReg Reg = 0; MCPhysReg StackPtrReg = 0; @@ -1555,13 +1548,13 @@ bool IsSimple = false; bool IsStoreFromReg = false; uint8_t Size = 0; - if (!BC.MIB->isStackAccess(*InstIter, IsLoad, IsStore, IsStoreFromReg, - Reg, SrcImm, StackPtrReg, StackOffset, Size, + if (!BC.MIB->isStackAccess(Inst, IsLoad, IsStore, IsStoreFromReg, Reg, + SrcImm, StackPtrReg, StackOffset, Size, IsSimple, IsIndexed)) continue; if (Reg != CSR || !IsStore || !IsSimple) continue; - SavePoint = &*InstIter; + SavePoint = &Inst; break; } if (SavePoint) diff --git a/bolt/lib/Profile/DataReader.cpp b/bolt/lib/Profile/DataReader.cpp --- a/bolt/lib/Profile/DataReader.cpp +++ b/bolt/lib/Profile/DataReader.cpp @@ -588,21 +588,21 @@ } uint64_t LastOffset = BF.getSize(); uint64_t TotalEntryCount = 0; - for (auto I = BF.BasicBlockOffsets.rbegin(), E = BF.BasicBlockOffsets.rend(); - I != E; ++I) { - uint64_t CurOffset = I->first; + for (BinaryFunction::BasicBlockOffset &BBOffset : + llvm::reverse(BF.BasicBlockOffsets)) { + uint64_t CurOffset = BBOffset.first; // Always work with samples multiplied by 1000 to avoid losing them if we // later need to normalize numbers uint64_t NumSamples = SampleDataOrErr->getSamples(CurOffset, LastOffset) * 1000; - if (NormalizeByInsnCount && I->second->getNumNonPseudos()) { - NumSamples /= I->second->getNumNonPseudos(); + if (NormalizeByInsnCount && BBOffset.second->getNumNonPseudos()) { + NumSamples /= BBOffset.second->getNumNonPseudos(); } else if (NormalizeByCalls) { - uint32_t NumCalls = I->second->getNumCalls(); + uint32_t NumCalls = BBOffset.second->getNumCalls(); NumSamples /= NumCalls + 1; } - I->second->setExecutionCount(NumSamples); - if (I->second->isEntryPoint()) + BBOffset.second->setExecutionCount(NumSamples); + if (BBOffset.second->isEntryPoint()) TotalEntryCount += NumSamples; LastOffset = CurOffset; } @@ -1276,8 +1276,8 @@ fetchMapEntry(MapTy &Map, const std::vector &Symbols) { // Do a reverse order iteration since the name in profile has a higher chance // of matching a name at the end of the list. - for (auto SI = Symbols.rbegin(), SE = Symbols.rend(); SI != SE; ++SI) { - auto I = Map.find(normalizeName((*SI)->getName())); + for (const MCSymbol *Symbol : llvm::reverse(Symbols)) { + auto I = Map.find(normalizeName(Symbol->getName())); if (I != Map.end()) return &I->getValue(); } @@ -1289,8 +1289,8 @@ fetchMapEntry(MapTy &Map, const std::vector &FuncNames) { // Do a reverse order iteration since the name in profile has a higher chance // of matching a name at the end of the list. - for (auto FI = FuncNames.rbegin(), FE = FuncNames.rend(); FI != FE; ++FI) { - auto I = Map.find(normalizeName(*FI)); + for (StringRef Name : llvm::reverse(FuncNames)) { + auto I = Map.find(normalizeName(Name)); if (I != Map.end()) return &I->getValue(); } @@ -1306,8 +1306,8 @@ std::vector AllData; // Do a reverse order iteration since the name in profile has a higher chance // of matching a name at the end of the list. - for (auto FI = FuncNames.rbegin(), FE = FuncNames.rend(); FI != FE; ++FI) { - std::string Name = normalizeName(*FI); + for (StringRef FuncName : llvm::reverse(FuncNames)) { + std::string Name = normalizeName(FuncName); const std::optional LTOCommonName = getLTOCommonName(Name); if (LTOCommonName) { auto I = LTOCommonNameMap.find(*LTOCommonName); diff --git a/bolt/lib/Rewrite/BoltDiff.cpp b/bolt/lib/Rewrite/BoltDiff.cpp --- a/bolt/lib/Rewrite/BoltDiff.cpp +++ b/bolt/lib/Rewrite/BoltDiff.cpp @@ -14,6 +14,7 @@ #include "bolt/Passes/IdenticalCodeFolding.h" #include "bolt/Profile/ProfileReaderBase.h" #include "bolt/Rewrite/RewriteInstance.h" +#include "llvm/ADT/STLExtras.h" #include "llvm/Support/CommandLine.h" #undef DEBUG_TYPE @@ -422,8 +423,8 @@ outs() << "=========================================================\n"; setRegularColor(); outs() << " * Functions with different contents do not appear here\n\n"; - for (auto I = LargestDiffs.rbegin(), E = LargestDiffs.rend(); I != E; ++I) { - const BinaryBasicBlock *BB2 = I->second; + for (const BinaryBasicBlock *BB2 : + llvm::make_second_range(llvm::reverse(LargestDiffs))) { const double Score2 = getNormalizedScore(*BB2, RI2); const double Score1 = getNormalizedScore(*BBMap[BB2], RI1); outs() << "BB " << BB2->getName() << " from " @@ -452,11 +453,10 @@ outs() << "=========================================================\n"; setRegularColor(); outs() << " * Functions with different contents do not appear here\n"; - for (auto I = EdgeMap.rbegin(), E = EdgeMap.rend(); I != E; ++I) { - std::tuple - &Edge2 = I->second.first; - std::tuple - &Edge1 = I->second.second; + for (std::pair &EI : + llvm::make_second_range(llvm::reverse(EdgeMap))) { + EdgeTy &Edge2 = EI.first; + EdgeTy &Edge1 = EI.second; const double Score2 = std::get<2>(Edge2); const double Score1 = std::get<2>(Edge1); outs() << "Edge (" << std::get<0>(Edge2)->getName() << " -> " @@ -547,9 +547,8 @@ << " largest differences in performance bin 2 -> bin 1:\n"; outs() << "=========================================================\n"; setRegularColor(); - for (auto I = LargestDiffs.rbegin(), E = LargestDiffs.rend(); I != E; ++I) { - const std::pair - &MapEntry = I->second; + for (decltype(this->FuncMap)::value_type &MapEntry : + llvm::make_second_range(llvm::reverse(LargestDiffs))) { if (opts::IgnoreUnchanged && MapEntry.second->computeHash(/*UseDFS=*/true) == MapEntry.first->computeHash(/*UseDFS=*/true)) @@ -592,8 +591,8 @@ << " hottest functions in binary 2:\n"; outs() << "=====================================\n"; setRegularColor(); - for (auto I = LargestBin2.rbegin(), E = LargestBin2.rend(); I != E; ++I) { - const std::pair &MapEntry = *I; + for (std::pair &MapEntry : + llvm::reverse(LargestBin2)) { outs() << "Function " << MapEntry.second->getDemangledName() << "\n"; auto Iter = ScoreMap.find(MapEntry.second); if (Iter != ScoreMap.end()) @@ -611,8 +610,8 @@ << " hottest functions in binary 1:\n"; outs() << "=====================================\n"; setRegularColor(); - for (auto I = LargestBin1.rbegin(), E = LargestBin1.rend(); I != E; ++I) { - const std::pair &MapEntry = *I; + for (const std::pair &MapEntry : + llvm::reverse(LargestBin1)) { outs() << "Function " << MapEntry.second->getDemangledName() << "\n\tScore bin1 = " << format("%.2f", MapEntry.first * 100.0) << "%\n";