Skip to content

Commit

Permalink
JIT: Don't put cold blocks in RPO during layout (#112448)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
amanasifkhalid authored Feb 14, 2025
1 parent ffece94 commit 02127c7
Showing 1 changed file with 3 additions and 3 deletions.
6 changes: 3 additions & 3 deletions src/coreclr/jit/fgopt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down

0 comments on commit 02127c7

Please # to comment.