1111// ===----------------------------------------------------------------------===//
1212
1313#include " swift/AST/SemanticAttrs.h"
14+ #include " swift/Basic/Defer.h"
1415#include " swift/SIL/BasicBlockBits.h"
1516#include " swift/SIL/SILArgument.h"
1617#include " swift/SIL/SILModule.h"
@@ -266,12 +267,17 @@ bool ColdBlockInfo::inferFromEdgeProfile(SILBasicBlock *BB) {
266267}
267268
268269void ColdBlockInfo::analyze (SILFunction *fn) {
270+ SWIFT_DEFER { changedMap = false ; };
271+
272+ LLVM_DEBUG (llvm::dbgs ()
273+ << " ColdBlockInfo::analyze on " << fn->getName () << " \n " );
269274 LLVM_DEBUG (llvm::dbgs () << " --> Before Stage 1\n " );
270275 LLVM_DEBUG (dump ());
271276
272277 BasicBlockSet foundExpectedCond (fn);
273278
274279 // Stage 1: Seed the graph with warm/cold blocks.
280+ changedMap = false ;
275281 for (auto &BB : *fn) {
276282 auto *term = BB.getTerminator ();
277283
@@ -304,9 +310,20 @@ void ColdBlockInfo::analyze(SILFunction *fn) {
304310
305311 LLVM_DEBUG (llvm::dbgs () << " --> After Stage 1; changedMap = "
306312 << changedMap << " \n " );
307- LLVM_DEBUG (dump (); changedMap = false );
313+ LLVM_DEBUG (dump ());
314+
315+ // / Latter stages are only for propagating coldness from other cold blocks.
316+ // /
317+ // / If we haven't changed the energy map at all in Stage 1, then we didn't
318+ // / find any new coldness, so stop early.
319+ if (!changedMap) {
320+ LLVM_DEBUG (llvm::dbgs ()
321+ << " --> Stopping early in " << fn->getName () << " \n " );
322+ return ;
323+ }
308324
309325 // Stage 2: Propagate via dominators
326+ changedMap = false ;
310327 SmallVector<SILBasicBlock *, 8 > scratch;
311328 for (auto &BB : *fn) {
312329 scratch.clear ();
@@ -354,9 +371,10 @@ void ColdBlockInfo::analyze(SILFunction *fn) {
354371
355372 LLVM_DEBUG (llvm::dbgs () << " --> After Stage 2; changedMap = "
356373 << changedMap << " \n " );
357- LLVM_DEBUG (dump (); changedMap = false );
374+ LLVM_DEBUG (dump ());
358375
359376 // / Stage 3: Backwards propagate coldness from successors.
377+ changedMap = false ;
360378 auto isColdBlock = [&](auto *bb) { return isCold (bb); };
361379
362380 unsigned completedIters = 0 ;
@@ -398,7 +416,7 @@ void ColdBlockInfo::analyze(SILFunction *fn) {
398416 " | converged after " << completedIters << " iters"
399417 << " over " << fn->size () << " blocks; "
400418 << " changedMap = " << changedMap << " \n " );
401- LLVM_DEBUG (dump (); changedMap = false );
419+ LLVM_DEBUG (dump ());
402420}
403421
404422inline bool isColdEnergy (ColdBlockInfo::Energy e) {
@@ -416,15 +434,21 @@ bool ColdBlockInfo::isCold(const SILBasicBlock *BB) const {
416434
417435void ColdBlockInfo::resetToCold (const SILBasicBlock *BB) {
418436 auto &entry = EnergyMap.getOrInsertDefault (BB);
419- LLVM_DEBUG (isColdEnergy (entry) ? false : changedMap = true );
437+ if (isColdEnergy (entry))
438+ return ;
439+
420440 entry.removeAll ();
421441 entry.insert (State::Cold);
442+ changedMap = true ;
422443}
423444
424445void ColdBlockInfo::set (const SILBasicBlock *BB, State::Temperature temp) {
425446 auto &entry = EnergyMap.getOrInsertDefault (BB);
426- LLVM_DEBUG (entry.contains (temp) ? false : changedMap = true );
447+ if (entry.contains (temp))
448+ return ;
449+
427450 entry.insert (temp);
451+ changedMap = true ;
428452}
429453
430454void ColdBlockInfo::setExpectedCondition (CondBranchInst *CBI, ExpectedValue value) {
0 commit comments