]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
IMPORT: ebtree: only use __builtin_prefetch() when supported
authorWilly Tarreau <w@1wt.eu>
Sat, 5 Jul 2025 19:57:33 +0000 (21:57 +0200)
committerWilly Tarreau <w@1wt.eu>
Wed, 17 Sep 2025 12:30:32 +0000 (14:30 +0200)
It looks like __builtin_prefetch() appeared in gcc-3.1 as there's no
mention of it in 3.0's doc. Let's replace it with eb_prefetch() which
maps to __builtin_prefetch() on supported compilers and falls back to
the usual do{}while(0) on other ones. It was tested to properly build
with tcc as well as gcc-2.95.

This is ebtree commit 7ee6ede56a57a046cb552ed31302b93ff1a21b1a.

include/import/eb32tree.h
include/import/eb64tree.h
include/import/ebmbtree.h
include/import/ebtree.h
src/eb32tree.c
src/eb64tree.c

index 292a10e3940d4b5650ab49ba3e6eef18e6c591d8..9b331f609312c27a99db8e2e2c63184faa167952 100644 (file)
@@ -137,8 +137,8 @@ static forceinline struct eb32_node *__eb32_lookup(struct eb_root *root, u32 x)
                node = container_of(eb_untag(troot, EB_NODE),
                                    struct eb32_node, node.branches);
 
-               __builtin_prefetch(node->node.branches.b[0], 0);
-               __builtin_prefetch(node->node.branches.b[1], 0);
+               eb_prefetch(node->node.branches.b[0], 0);
+               eb_prefetch(node->node.branches.b[1], 0);
 
                y = node->key ^ x;
                z = 1U << (node->node.bit & 31);
@@ -191,8 +191,8 @@ static forceinline struct eb32_node *__eb32i_lookup(struct eb_root *root, s32 x)
                node = container_of(eb_untag(troot, EB_NODE),
                                    struct eb32_node, node.branches);
 
-               __builtin_prefetch(node->node.branches.b[0], 0);
-               __builtin_prefetch(node->node.branches.b[1], 0);
+               eb_prefetch(node->node.branches.b[0], 0);
+               eb_prefetch(node->node.branches.b[1], 0);
 
                y = node->key ^ x;
                z = 1U << (node->node.bit & 31);
@@ -271,8 +271,8 @@ __eb32_insert(struct eb_root *root, struct eb32_node *new) {
                old = container_of(eb_untag(troot, EB_NODE),
                                    struct eb32_node, node.branches);
 
-               __builtin_prefetch(old->node.branches.b[0], 0);
-               __builtin_prefetch(old->node.branches.b[1], 0);
+               eb_prefetch(old->node.branches.b[0], 0);
+               eb_prefetch(old->node.branches.b[1], 0);
 
                old_node_bit = old->node.bit;
 
@@ -408,8 +408,8 @@ __eb32i_insert(struct eb_root *root, struct eb32_node *new) {
                old = container_of(eb_untag(troot, EB_NODE),
                                    struct eb32_node, node.branches);
 
-               __builtin_prefetch(old->node.branches.b[0], 0);
-               __builtin_prefetch(old->node.branches.b[1], 0);
+               eb_prefetch(old->node.branches.b[0], 0);
+               eb_prefetch(old->node.branches.b[1], 0);
 
                old_node_bit = old->node.bit;
 
index 5de45dd6c2d6de703edff49318be3ee639e226d5..ca5330b52d414f248261ef71f0c686acf95d2adc 100644 (file)
@@ -137,8 +137,8 @@ static forceinline struct eb64_node *__eb64_lookup(struct eb_root *root, u64 x)
                node = container_of(eb_untag(troot, EB_NODE),
                                    struct eb64_node, node.branches);
 
-               __builtin_prefetch(node->node.branches.b[0], 0);
-               __builtin_prefetch(node->node.branches.b[1], 0);
+               eb_prefetch(node->node.branches.b[0], 0);
+               eb_prefetch(node->node.branches.b[1], 0);
 
                y = node->key ^ x;
                z = 1ULL << (node->node.bit & 63);
@@ -191,8 +191,8 @@ static forceinline struct eb64_node *__eb64i_lookup(struct eb_root *root, s64 x)
                node = container_of(eb_untag(troot, EB_NODE),
                                    struct eb64_node, node.branches);
 
-               __builtin_prefetch(node->node.branches.b[0], 0);
-               __builtin_prefetch(node->node.branches.b[1], 0);
+               eb_prefetch(node->node.branches.b[0], 0);
+               eb_prefetch(node->node.branches.b[1], 0);
 
                y = node->key ^ x;
                z = 1ULL << (node->node.bit & 63);
@@ -317,8 +317,8 @@ __eb64_insert(struct eb_root *root, struct eb64_node *new) {
                old = container_of(eb_untag(troot, EB_NODE),
                                    struct eb64_node, node.branches);
 
-               __builtin_prefetch(old->node.branches.b[0], 0);
-               __builtin_prefetch(old->node.branches.b[1], 0);
+               eb_prefetch(old->node.branches.b[0], 0);
+               eb_prefetch(old->node.branches.b[1], 0);
 
                old_node_bit = old->node.bit;
 
@@ -503,8 +503,8 @@ __eb64i_insert(struct eb_root *root, struct eb64_node *new) {
                old = container_of(eb_untag(troot, EB_NODE),
                                    struct eb64_node, node.branches);
 
-               __builtin_prefetch(old->node.branches.b[0], 0);
-               __builtin_prefetch(old->node.branches.b[1], 0);
+               eb_prefetch(old->node.branches.b[0], 0);
+               eb_prefetch(old->node.branches.b[1], 0);
 
                old_node_bit = old->node.bit;
 
index d9f34f4e857156c3f62084931ac002a3bc0f55cc..1d55e334ac0ab9fa174a35ed62e5671c0957881a 100644 (file)
@@ -240,8 +240,8 @@ static forceinline struct ebmb_node *__ebmb_lookup(struct eb_root *root, const v
                b = *(unsigned char *)x;
                side = 1 << node_bit;
 
-               __builtin_prefetch(node->node.branches.b[0], 0);
-               __builtin_prefetch(node->node.branches.b[1], 0);
+               eb_prefetch(node->node.branches.b[0], 0);
+               eb_prefetch(node->node.branches.b[1], 0);
 
                k = node->key[pos];
                b0 = node->node.branches.b[0];
index 31a9cac109c1a7685205fd1adb4915e66e257509..2506e288ba4750b36e11e67adf99d74349237fdb 100644 (file)
@@ -499,6 +499,15 @@ __eb_insert_dup(struct eb_node *sub, struct eb_node *new)
        }
 }
 
+/* __builtin_prefetch() appears in gcc-3.1 documentation */
+#if !defined(eb_prefetch)
+# if defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)))
+#  define eb_prefetch(a,b) __builtin_prefetch(a,b)
+# else
+#  define eb_prefetch(a,b) do { } while (0)
+# endif
+#endif
+
 
 /**************************************\
  * Public functions, for the end-user *
index 2e824a734d5c8169206764aa9745f6b13f085479..7659d84e123bced2572bccac2f4399699ef30e37 100644 (file)
@@ -73,8 +73,8 @@ struct eb32_node *eb32_lookup_le(struct eb_root *root, u32 x)
                node = container_of(eb_untag(troot, EB_NODE),
                                    struct eb32_node, node.branches);
 
-               __builtin_prefetch(node->node.branches.b[0], 0);
-               __builtin_prefetch(node->node.branches.b[1], 0);
+               eb_prefetch(node->node.branches.b[0], 0);
+               eb_prefetch(node->node.branches.b[1], 0);
 
                y = node->key;
                z = 1U << (node->node.bit & 31);
@@ -168,8 +168,8 @@ struct eb32_node *eb32_lookup_ge(struct eb_root *root, u32 x)
                node = container_of(eb_untag(troot, EB_NODE),
                                    struct eb32_node, node.branches);
 
-               __builtin_prefetch(node->node.branches.b[0], 0);
-               __builtin_prefetch(node->node.branches.b[1], 0);
+               eb_prefetch(node->node.branches.b[0], 0);
+               eb_prefetch(node->node.branches.b[1], 0);
 
                y = node->key;
                z = 1U << (node->node.bit & 31);
index c1e183ea656d16bce8f14cce0e332b8fd1254c2f..c2ed249ffb497ea802a5e955f6fabeebdc047d0e 100644 (file)
@@ -73,8 +73,8 @@ struct eb64_node *eb64_lookup_le(struct eb_root *root, u64 x)
                node = container_of(eb_untag(troot, EB_NODE),
                                    struct eb64_node, node.branches);
 
-               __builtin_prefetch(node->node.branches.b[0], 0);
-               __builtin_prefetch(node->node.branches.b[1], 0);
+               eb_prefetch(node->node.branches.b[0], 0);
+               eb_prefetch(node->node.branches.b[1], 0);
 
                y = node->key;
                z = 1ULL << (node->node.bit & 63);
@@ -168,8 +168,8 @@ struct eb64_node *eb64_lookup_ge(struct eb_root *root, u64 x)
                node = container_of(eb_untag(troot, EB_NODE),
                                    struct eb64_node, node.branches);
 
-               __builtin_prefetch(node->node.branches.b[0], 0);
-               __builtin_prefetch(node->node.branches.b[1], 0);
+               eb_prefetch(node->node.branches.b[0], 0);
+               eb_prefetch(node->node.branches.b[1], 0);
 
                y = node->key;
                z = 1ULL << (node->node.bit & 63);