]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: ebtree: remove dependency on incorrect macro for bits per long
authorWilly Tarreau <w@1wt.eu>
Sat, 28 Aug 2021 09:55:53 +0000 (11:55 +0200)
committerWilly Tarreau <w@1wt.eu>
Sat, 28 Aug 2021 09:55:53 +0000 (11:55 +0200)
The code used to rely on BITS_PER_LONG to decide on the most efficient
way to perform a 64-bit shift, but this macro is not defined (at best
it's __BITS_PER_LONG) and it's likely that it's been like this since
the early implementation of ebtrees designed on i386. Let's remove the
test on this macro and rely on sizeof(long) instead, it also has the
benefit of letting the compiler validate the two branches.

This can be backported to all versions. Thanks to Ezequiel Garcia for
reporting this one in issue #1369.

include/import/eb64tree.h

index ff2feee44eb6a2b3335a581d93a45d62decb381c..90635b7bf7f7a4f7b75711e4d00c7d22fa82fb13 100644 (file)
@@ -375,17 +375,21 @@ __eb64_insert(struct eb_root *root, struct eb64_node *new) {
 
                /* walk down */
                root = &old->node.branches;
-#if BITS_PER_LONG >= 64
-               side = (newkey >> old_node_bit) & EB_NODE_BRANCH_MASK;
-#else
-               side = newkey;
-               side >>= old_node_bit;
-               if (old_node_bit >= 32) {
-                       side = newkey >> 32;
-                       side >>= old_node_bit & 0x1F;
+
+               if (sizeof(long) >= 8) {
+                       side = newkey >> old_node_bit;
+               } else {
+                       /* note: provides the best code on low-register count archs
+                        * such as i386.
+                        */
+                       side = newkey;
+                       side >>= old_node_bit;
+                       if (old_node_bit >= 32) {
+                               side = newkey >> 32;
+                               side >>= old_node_bit & 0x1F;
+                       }
                }
                side &= EB_NODE_BRANCH_MASK;
-#endif
                troot = root->b[side];
        }
 
@@ -553,17 +557,21 @@ __eb64i_insert(struct eb_root *root, struct eb64_node *new) {
 
                /* walk down */
                root = &old->node.branches;
-#if BITS_PER_LONG >= 64
-               side = (newkey >> old_node_bit) & EB_NODE_BRANCH_MASK;
-#else
-               side = newkey;
-               side >>= old_node_bit;
-               if (old_node_bit >= 32) {
-                       side = newkey >> 32;
-                       side >>= old_node_bit & 0x1F;
+
+               if (sizeof(long) >= 8) {
+                       side = newkey >> old_node_bit;
+               } else {
+                       /* note: provides the best code on low-register count archs
+                        * such as i386.
+                        */
+                       side = newkey;
+                       side >>= old_node_bit;
+                       if (old_node_bit >= 32) {
+                               side = newkey >> 32;
+                               side >>= old_node_bit & 0x1F;
+                       }
                }
                side &= EB_NODE_BRANCH_MASK;
-#endif
                troot = root->b[side];
        }