Propagate cold annotations to edge blocks (#4636)

Update the lowering stage to mark edge blocks as cold if either the
predecessor or successor block is cold.
This commit is contained in:
Michael Chesser
2022-08-09 14:35:57 +09:30
committed by GitHub
parent 0b1f51f804
commit 8aee85ebaa
2 changed files with 17 additions and 9 deletions

View File

@@ -329,7 +329,7 @@ mod test {
// 00000018 81E834120000 sub eax,0x1234 // 00000018 81E834120000 sub eax,0x1234
// 0000001E 4401C0 add eax,r8d // 0000001E 4401C0 add eax,r8d
// 00000021 85FF test edi,edi // 00000021 85FF test edi,edi
// 00000023 0F8505000000 jnz near 0x2e // 00000023 0F851D000000 jnz near 0x46
// 00000029 4889EC mov rsp,rbp // 00000029 4889EC mov rsp,rbp
// 0000002C 5D pop rbp // 0000002C 5D pop rbp
// 0000002D C3 ret // 0000002D C3 ret
@@ -338,12 +338,13 @@ mod test {
// 00000038 4585C0 test r8d,r8d // 00000038 4585C0 test r8d,r8d
// 0000003B 0F85EDFFFFFF jnz near 0x2e // 0000003B 0F85EDFFFFFF jnz near 0x2e
// 00000041 E9CFFFFFFF jmp 0x15 // 00000041 E9CFFFFFFF jmp 0x15
// 00000046 E9E3FFFFFF jmp 0x2e
let golden = vec![ let golden = vec![
85, 72, 137, 229, 129, 199, 52, 18, 0, 0, 133, 255, 15, 132, 28, 0, 0, 0, 73, 137, 248, 85, 72, 137, 229, 129, 199, 52, 18, 0, 0, 133, 255, 15, 132, 28, 0, 0, 0, 73, 137, 248,
72, 137, 248, 129, 232, 52, 18, 0, 0, 68, 1, 192, 133, 255, 15, 133, 5, 0, 0, 0, 72, 72, 137, 248, 129, 232, 52, 18, 0, 0, 68, 1, 192, 133, 255, 15, 133, 29, 0, 0, 0, 72,
137, 236, 93, 195, 73, 137, 248, 65, 129, 192, 52, 18, 0, 0, 69, 133, 192, 15, 133, 137, 236, 93, 195, 73, 137, 248, 65, 129, 192, 52, 18, 0, 0, 69, 133, 192, 15, 133,
237, 255, 255, 255, 233, 207, 255, 255, 255, 237, 255, 255, 255, 233, 207, 255, 255, 255, 233, 227, 255, 255, 255,
]; ];
assert_eq!(code, &golden[..]); assert_eq!(code, &golden[..]);

View File

@@ -432,12 +432,19 @@ impl BlockLoweringOrder {
lowered_order.push(block); lowered_order.push(block);
lowered_succ_ranges.push(succ_range); lowered_succ_ranges.push(succ_range);
if block match block {
.orig_block() LoweredBlock::Orig { block }
.map(|b| f.layout.is_cold(b)) | LoweredBlock::OrigAndEdge { block, .. }
.unwrap_or(false) | LoweredBlock::EdgeAndOrig { block, .. } => {
{ if f.layout.is_cold(block) {
cold_blocks.insert(index); cold_blocks.insert(index);
}
}
LoweredBlock::Edge { pred, succ, .. } => {
if f.layout.is_cold(pred) || f.layout.is_cold(succ) {
cold_blocks.insert(index);
}
}
} }
} }