Details
-
Bug
-
Status: Closed (View Workflow)
-
Minor
-
Resolution: Fixed
-
10.1(EOL)
-
None
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.
Attachments
Activity
Field | Original Value | New Value |
---|---|---|
Epic Link | MDEV-7941 [ 50796 ] |
Affects Version/s | 10.1 [ 16100 ] |
Fix Version/s | 10.1 [ 16100 ] |
Status | Open [ 1 ] | In Progress [ 3 ] |
Component/s | Storage Engine - InnoDB [ 10129 ] | |
Component/s | Storage Engine - XtraDB [ 10135 ] | |
Fix Version/s | 10.1.5 [ 18813 ] | |
Fix Version/s | 10.1 [ 16100 ] | |
Resolution | Fixed [ 1 ] | |
Status | In Progress [ 3 ] | Closed [ 6 ] |
Workflow | MariaDB v2 [ 60397 ] | MariaDB v3 [ 63402 ] |
Workflow | MariaDB v3 [ 63402 ] | MariaDB v4 [ 149025 ] |
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)) {
&& UNIV_UNLIKELY(!table->col_names)) {
page/page0zip.cc: if (UNIV_LIKELY(c_stream->avail_in)) {
dict/dict0mem.cc: if (UNIV_LIKELY
Fixed these conditions so that they evaluate TRUE/FALSE.