aboutsummaryrefslogtreecommitdiff
path: root/lib/std/priority_dequeue.zig
diff options
context:
space:
mode:
authorNiles Salter <Validark@pm.me>2023-06-20 17:32:07 -0600
committerAndrew Kelley <andrew@ziglang.org>2023-06-22 01:57:28 -0700
commitff5850183eee854fdfe0d3f7b7242b9ff56c2116 (patch)
tree715ed346487b0f221f92e26280ea5e5b52a9254a /lib/std/priority_dequeue.zig
parent991e00c2702b31dffb7b5ada26c7b19a552502a7 (diff)
downloadzig-ff5850183eee854fdfe0d3f7b7242b9ff56c2116.tar.gz
zig-ff5850183eee854fdfe0d3f7b7242b9ff56c2116.zip
[priority_deque] simplify & optimize isMinLayer
LLVM has trouble compiling the old implementation, (presumably) because `leading_zeros` is thought to be a `u7` rather than a `u6`, which means `63 - clz` is not equivalent to `63 ^ clz`, which means it can't deduce that the final condition can simply be flipped. (I am assuming `usize` is a `u64` here for ease of understanding, but it's the same for any power of 2) https://zig.godbolt.org/z/Pbj4P7ob3 The new version is slightly better too because `isMinLayer(maxInt(usize))` is now well-defined behavior.
Diffstat (limited to 'lib/std/priority_dequeue.zig')
-rw-r--r--lib/std/priority_dequeue.zig4
1 files changed, 1 insertions, 3 deletions
diff --git a/lib/std/priority_dequeue.zig b/lib/std/priority_dequeue.zig
index 05e3d7e58b..510c3dd1cf 100644
--- a/lib/std/priority_dequeue.zig
+++ b/lib/std/priority_dequeue.zig
@@ -69,9 +69,7 @@ pub fn PriorityDequeue(comptime T: type, comptime Context: type, comptime compar
// The first element is on a min layer;
// next two are on a max layer;
// next four are on a min layer, and so on.
- const leading_zeros = @clz(index + 1);
- const highest_set_bit = @bitSizeOf(usize) - 1 - leading_zeros;
- return (highest_set_bit & 1) == 0;
+ return 1 == @clz(index +% 1) & 1;
}
fn nextIsMinLayer(self: Self) bool {