From 84340d108be3963a37cd4640bf2bbe1b05e67e42 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 18 Oct 2024 18:42:47 +0200 Subject: [PATCH] OPTIM: buffers: avoid a useless wrapping check for ofs == 0 As mentioned in previous commit, b_peek_ofs() performs a wrapping check but is often called with ofs == 0 as a constant. We can detect this case with __builtin_const_p() so it makes sense to use it. A test shows a size reduction of about 320 bytes, which is not much, but it happens in hot code paths, and each 16 bytes reduction indicates an eliminated conditional branch. Some clear winners are ci_getblk_nc() (-48 bytes), h2c_dec_hdrs (-141B), h1_copy_msg_data (-124B), tcpcheck_spop_expect_hello (-80B), h1_parse_msg_data (-44B). These ones will definitely benefit from doing less conditional jumps. --- include/haproxy/buf.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/include/haproxy/buf.h b/include/haproxy/buf.h index bb0f0b73b..2081a2ab7 100644 --- a/include/haproxy/buf.h +++ b/include/haproxy/buf.h @@ -183,8 +183,9 @@ static inline size_t b_peek_ofs(const struct buffer *b, size_t ofs) { size_t ret = __b_peek_ofs(b, ofs); - if (ret >= b->size) - ret -= b->size; + if (likely(!__builtin_constant_p(ofs) || ofs)) + if (ret >= b->size) + ret -= b->size; return ret; }