11
11
// ===----------------------------------------------------------------------===//
12
12
13
13
#include " swift/AST/SemanticAttrs.h"
14
+ #include " swift/Basic/Defer.h"
14
15
#include " swift/SIL/BasicBlockBits.h"
15
16
#include " swift/SIL/SILArgument.h"
16
17
#include " swift/SIL/SILModule.h"
@@ -266,12 +267,17 @@ bool ColdBlockInfo::inferFromEdgeProfile(SILBasicBlock *BB) {
266
267
}
267
268
268
269
void ColdBlockInfo::analyze (SILFunction *fn) {
270
+ SWIFT_DEFER { changedMap = false ; };
271
+
272
+ LLVM_DEBUG (llvm::dbgs ()
273
+ << " ColdBlockInfo::analyze on " << fn->getName () << " \n " );
269
274
LLVM_DEBUG (llvm::dbgs () << " --> Before Stage 1\n " );
270
275
LLVM_DEBUG (dump ());
271
276
272
277
BasicBlockSet foundExpectedCond (fn);
273
278
274
279
// Stage 1: Seed the graph with warm/cold blocks.
280
+ changedMap = false ;
275
281
for (auto &BB : *fn) {
276
282
auto *term = BB.getTerminator ();
277
283
@@ -304,9 +310,20 @@ void ColdBlockInfo::analyze(SILFunction *fn) {
304
310
305
311
LLVM_DEBUG (llvm::dbgs () << " --> After Stage 1; changedMap = "
306
312
<< 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
+ }
308
324
309
325
// Stage 2: Propagate via dominators
326
+ changedMap = false ;
310
327
SmallVector<SILBasicBlock *, 8 > scratch;
311
328
for (auto &BB : *fn) {
312
329
scratch.clear ();
@@ -354,9 +371,10 @@ void ColdBlockInfo::analyze(SILFunction *fn) {
354
371
355
372
LLVM_DEBUG (llvm::dbgs () << " --> After Stage 2; changedMap = "
356
373
<< changedMap << " \n " );
357
- LLVM_DEBUG (dump (); changedMap = false );
374
+ LLVM_DEBUG (dump ());
358
375
359
376
// / Stage 3: Backwards propagate coldness from successors.
377
+ changedMap = false ;
360
378
auto isColdBlock = [&](auto *bb) { return isCold (bb); };
361
379
362
380
unsigned completedIters = 0 ;
@@ -398,7 +416,7 @@ void ColdBlockInfo::analyze(SILFunction *fn) {
398
416
" | converged after " << completedIters << " iters"
399
417
<< " over " << fn->size () << " blocks; "
400
418
<< " changedMap = " << changedMap << " \n " );
401
- LLVM_DEBUG (dump (); changedMap = false );
419
+ LLVM_DEBUG (dump ());
402
420
}
403
421
404
422
inline bool isColdEnergy (ColdBlockInfo::Energy e) {
@@ -416,15 +434,21 @@ bool ColdBlockInfo::isCold(const SILBasicBlock *BB) const {
416
434
417
435
void ColdBlockInfo::resetToCold (const SILBasicBlock *BB) {
418
436
auto &entry = EnergyMap.getOrInsertDefault (BB);
419
- LLVM_DEBUG (isColdEnergy (entry) ? false : changedMap = true );
437
+ if (isColdEnergy (entry))
438
+ return ;
439
+
420
440
entry.removeAll ();
421
441
entry.insert (State::Cold);
442
+ changedMap = true ;
422
443
}
423
444
424
445
void ColdBlockInfo::set (const SILBasicBlock *BB, State::Temperature temp) {
425
446
auto &entry = EnergyMap.getOrInsertDefault (BB);
426
- LLVM_DEBUG (entry.contains (temp) ? false : changedMap = true );
447
+ if (entry.contains (temp))
448
+ return ;
449
+
427
450
entry.insert (temp);
451
+ changedMap = true ;
428
452
}
429
453
430
454
void ColdBlockInfo::setExpectedCondition (CondBranchInst *CBI, ExpectedValue value) {
0 commit comments