From 3fa971a510172be922eeaaee9fd3533dc9628832 Mon Sep 17 00:00:00 2001 From: Andrea Piseri Date: Wed, 21 Dec 2022 22:10:02 +0100 Subject: [PATCH] Add the inner `for` loop back in the logic This could be easier to predict in cases where one of `left` and `right` is significantly greater than the other, and as such the same branch is taken multiple times in a row --- core/slice/ptr.odin | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/core/slice/ptr.odin b/core/slice/ptr.odin index 701e55495..e2f1c3e7b 100644 --- a/core/slice/ptr.odin +++ b/core/slice/ptr.odin @@ -75,15 +75,25 @@ ptr_rotate :: proc(left: int, mid: ^$T, right: int) { // TODO(bill): Optimization with a buffer for smaller ranges for left > 0 && right > 0 { if left >= right { - ptr_swap_non_overlapping(ptr_sub(mid, right), mid, right * size_of(T)) - mid = ptr_sub(mid, right) + for { + ptr_swap_non_overlapping(ptr_sub(mid, right), mid, right * size_of(T)) + mid = ptr_sub(mid, right) - left -= right + left -= right + if left < right { + break + } + } } else { - ptr_swap_non_overlapping(ptr_sub(mid, left), mid, left * size_of(T)) - mid = ptr_add(mid, left) + for { + ptr_swap_non_overlapping(ptr_sub(mid, left), mid, left * size_of(T)) + mid = ptr_add(mid, left) - right -= left + right -= left + if right < left { + break + } + } } } }