From ee0376c368c50c7dadc84801e88cfdbf250b92a4 Mon Sep 17 00:00:00 2001 From: Lukas Bergdoll Date: Sat, 11 Feb 2023 09:32:52 +0100 Subject: [PATCH] Split branches in heapsort child selection This allows even better code-gen, cmp + adc. While also more clearly communicating the intent. --- library/core/src/slice/sort.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/library/core/src/slice/sort.rs b/library/core/src/slice/sort.rs index 990540f55f5..8f02a446670 100644 --- a/library/core/src/slice/sort.rs +++ b/library/core/src/slice/sort.rs @@ -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]) {