Split branches in heapsort child selection

This allows even better code-gen, cmp + adc. While also more clearly
communicating the intent.
This commit is contained in:
Lukas Bergdoll 2023-02-11 09:32:52 +01:00
parent 7e072199a6
commit ee0376c368

View File

@ -198,7 +198,12 @@ where
}
// Choose the greater child.
child += (child + 1 < v.len() && is_less(&v[child], &v[child + 1])) as usize;
if child + 1 < v.len() {
// We need a branch to be sure not to out-of-bounds index,
// but it's highly predictable. The comparison, however,
// is better done branchless, especially for primitives.
child += is_less(&v[child], &v[child + 1]) as usize;
}
// Stop if the invariant holds at `node`.
if !is_less(&v[node], &v[child]) {