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:
@@ -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[..]);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user