From 02127c782adbf0cded3ed0778d4bf694e5e75996 Mon Sep 17 00:00:00 2001 From: Aman Khalid Date: Fri, 14 Feb 2025 12:16:23 -0500 Subject: [PATCH] JIT: Don't put cold blocks in RPO during layout (#112448) Split off from #112004. Excluding cold blocks from the loop-aware RPO simplifies how we compute the initial layout to feed into 3-opt, as it eliminates the need to manually move cold blocks out-of-line, instead allowing them to sink to the end of the method. This has the consequence of changing -- most likely worsening -- the layout of cold sections. However, our current threshold for "cold" is low enough that I don't think this churn matters: While BB_COLD_WEIGHT is 0.01, we compare this to normalized weights scaled by BB_UNITY_WEIGHT (100), so normalized weights must be below 0.0001 to be considered cold. In other words, profile data must suggest a block executes less than 0.01% (not 1%) of the time to be excluded from reordering. --- src/coreclr/jit/fgopt.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/coreclr/jit/fgopt.cpp b/src/coreclr/jit/fgopt.cpp index 7f5cf679ff64f8..cb17a22de69054 100644 --- a/src/coreclr/jit/fgopt.cpp +++ b/src/coreclr/jit/fgopt.cpp @@ -4677,10 +4677,10 @@ void Compiler::fgDoReversePostOrderLayout() BasicBlock** const rpoSequence = new (this, CMK_BasicBlock) BasicBlock*[m_dfsTree->GetPostOrderCount()]; unsigned numBlocks = 0; - auto addToSequence = [rpoSequence, &numBlocks](BasicBlock* block) { - // Exclude handler regions from being reordered. + auto addToSequence = [this, rpoSequence, &numBlocks](BasicBlock* block) { + // Exclude handler regions and cold blocks from being reordered. // - if (!block->hasHndIndex()) + if (!block->hasHndIndex() && !block->isBBWeightCold(this)) { rpoSequence[numBlocks++] = block; }