[MDEV-7942] InnoDB: abuse of UNIV_LIKELY()/UNIV_UNLIKELY() Created: 2015-04-09  Updated: 2015-05-11  Resolved: 2015-05-11

Status: Closed
Project: MariaDB Server
Component/s: Storage Engine - InnoDB, Storage Engine - XtraDB
Affects Version/s: 10.1
Fix Version/s: 10.1.5

Type: Bug Priority: Minor
Reporter: Sergey Vojtovich Assignee: Jan Lindström (Inactive)
Resolution: Fixed Votes: 0
Labels: None

Epic Link: Performance: micro optimizations

 Description   

UNIV_LIKELY()/UNIV_UNLIKELY() hints are supposed to improve branch prediction. They're defined in InnoDB as following:

/* Tell the compiler that 'expr' probably evaluates to 'constant'. */
# define UNIV_EXPECT(expr,constant) __builtin_expect(expr, constant)
/* Tell the compiler that cond is likely to hold */
#define UNIV_LIKELY(cond) UNIV_EXPECT(cond, TRUE)
/* Tell the compiler that cond is unlikely to hold */
#define UNIV_UNLIKELY(cond) UNIV_EXPECT(cond, FALSE)

In other words they're expected to work only if cond evaluates to TRUE or FALSE,
see https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html.

However there're a few conditions that may evaluate to different values, e.g.:

page/page0zip.cc:		if (UNIV_LIKELY(c_stream->avail_in)) {
page/page0zip.cc:			if (UNIV_LIKELY(c_stream->avail_in)) {
dict/dict0mem.cc:		if (UNIV_LIKELY(i) && UNIV_UNLIKELY(!table->col_names)) {

Either fix condition or fix UNIV_LIKELY() to evaluate condition to bool (see likely() in my_global.h).
Note: we'll gain little to nothing in terms of performance out of this. But at least we'll have correct use of these compiler hints.



 Comments   
Comment by Jan Lindström (Inactive) [ 2015-05-11 ]

commit 58e8db2eb398a812e2894d28db4173a4f67fea06
Author: Jan Lindström <jan.lindstrom@mariadb.com>
Date: Mon May 11 14:29:14 2015 +0300

MDEV-7942: InnoDB: abuse of UNIV_LIKELY()/UNIV_UNLIKELY()

UNIV_LIKELY()/UNIV_UNLIKELY() hints are supposed to improve branch prediction.
Currently, they're expected to work only if cond evaluates to TRUE or FALSE.

However there're a few conditions that may evaluate to different values, e.g.:

page/page0zip.cc: if (UNIV_LIKELY(c_stream->avail_in)) {
page/page0zip.cc: if (UNIV_LIKELY(c_stream->avail_in)) {
dict/dict0mem.cc: if (UNIV_LIKELY && UNIV_UNLIKELY(!table->col_names)) {

Fixed these conditions so that they evaluate TRUE/FALSE.

Generated at Thu Feb 08 07:23:28 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.