summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@tavianator.com>2025-02-10 11:04:26 -0500
committerTavian Barnes <tavianator@tavianator.com>2025-02-11 14:28:46 -0500
commit6e93417d275be9436b986f48b39b2dbacee730b4 (patch)
tree86d9d419deb3866c6e0133b87621182154b46726
parent069b203617ca643b94122e41d34699c4f2ef949e (diff)
downloadbfs-6e93417d275be9436b986f48b39b2dbacee730b4.tar.xz
trie: Micro-optimize trie_representative()
popcount(map & (bit - 1) & mask) has a longer critical path than popcount(map & (bit - 1)) & mask.
-rw-r--r--src/trie.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/src/trie.c b/src/trie.c
index a4829e3..aac79d7 100644
--- a/src/trie.c
+++ b/src/trie.c
@@ -211,10 +211,11 @@ static struct trie_leaf *trie_representative(const struct trie *trie, const void
if ((offset >> 1) < length) {
unsigned char nibble = trie_key_nibble(key, length, offset);
unsigned int bit = 1U << nibble;
- // bits = bitmap & bit ? bitmap & (bit - 1) : 0
- unsigned int mask = -!!(node->bitmap & bit);
- unsigned int bits = node->bitmap & (bit - 1) & mask;
- index = count_ones(bits);
+ unsigned int map = node->bitmap;
+ unsigned int bits = map & (bit - 1);
+ unsigned int mask = -!!(map & bit);
+ // index = (map & bit) ? count_ones(bits) : 0;
+ index = count_ones(bits) & mask;
}
ptr = node->children[index];
}