* [PATCH] libgomp: start using LIKELY/UNLIKELY macros
@ 2022-05-25 11:52 Martin Liška
2022-05-25 11:55 ` Jakub Jelinek
0 siblings, 1 reply; 4+ messages in thread
From: Martin Liška @ 2022-05-25 11:52 UTC (permalink / raw)
To: gcc-patches; +Cc: Jakub Jelinek, Tobias Burnus
Similarly to g:22d9c8802add09a93308319fc37dd3a0f1125393, I would like to use
{UN,}LIKELY macros in libgomp. If the community is fine, I'm planning doing
the same in other GCC's libraries.
Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
Ready to be installed?
Thanks,
Martin
libgomp/ChangeLog:
* libgomp.h (LIKELY): Define macro.
(UNLIKELY): Likewise.
* affinity-fmt.c (gomp_display_string): Use the macros.
(gomp_display_repeat): Likewise.
* alloc.c (defined): Likewise.
* allocator.c (omp_aligned_alloc): Likewise.
(GOMP_alloc): Likewise.
(omp_aligned_calloc): Likewise.
(omp_realloc): Likewise.
* config/gcn/bar.c (gomp_barrier_wait_end): Likewise.
(gomp_team_barrier_wait_end): Likewise.
(gomp_team_barrier_wait_final): Likewise.
(gomp_team_barrier_wait_cancel_end): Likewise.
* config/gcn/bar.h (gomp_team_barrier_cancelled): Likewise.
* config/linux/alpha/futex.h (futex_wait): Likewise.
(futex_wake): Likewise.
* config/linux/bar.c (gomp_barrier_wait_end): Likewise.
(gomp_team_barrier_wait_end): Likewise.
(gomp_team_barrier_wait_final): Likewise.
(gomp_team_barrier_wait_cancel_end): Likewise.
* config/linux/bar.h (gomp_team_barrier_cancelled): Likewise.
* config/linux/futex.h (futex_wait): Likewise.
(futex_wake): Likewise.
* config/linux/ia64/futex.h (futex_wait): Likewise.
(futex_wake): Likewise.
* config/linux/lock.c (gomp_tid): Likewise.
* config/linux/mutex.h (gomp_mutex_unlock): Likewise.
* config/linux/powerpc/futex.h (sys_futex0): Likewise.
(futex_wait): Likewise.
(futex_wake): Likewise.
* config/linux/s390/futex.h (futex_wait): Likewise.
(futex_wake): Likewise.
* config/linux/sem.c (gomp_sem_wait_slow): Likewise.
* config/linux/sem.h (gomp_sem_post): Likewise.
* config/linux/sparc/futex.h (futex_wait): Likewise.
(futex_wake): Likewise.
* config/linux/wait.h (do_spin): Likewise.
* config/linux/x86/futex.h (futex_wait): Likewise.
(futex_wake): Likewise.
* config/nvptx/bar.c (futex_wait): Likewise.
* config/nvptx/bar.h (gomp_team_barrier_cancelled): Likewise.
* config/posix/bar.h (gomp_team_barrier_cancelled): Likewise.
* config/posix/pool.h (gomp_get_thread_pool): Likewise.
* config/rtems/bar.c (do_spin): Likewise.
* config/rtems/bar.h (gomp_team_barrier_cancelled): Likewise.
* config/rtems/pool.h (gomp_get_own_thread_pool): Likewise.
(gomp_get_thread_pool): Likewise.
* iter.c (gomp_iter_dynamic_next): Likewise.
(gomp_iter_guided_next): Likewise.
* iter_ull.c (gomp_iter_ull_static_next): Likewise.
(gomp_iter_ull_dynamic_next_locked): Likewise.
(gomp_iter_ull_dynamic_next): Likewise.
(gomp_iter_ull_guided_next_locked): Likewise.
(gomp_iter_ull_guided_next): Likewise.
(gomp_vdebug): Likewise.
(gomp_debug): Likewise.
(gomp_finish_task): Likewise.
(gomp_work_share_init_done): Likewise.
* loop.c (gomp_loop_init): Likewise.
* loop_ull.c (gomp_loop_ull_init): Likewise.
* oacc-int.h (GOACC_PROF_ENABLED): Likewise.
* oacc-profiling.c (_goacc_profiling_dispatch_p): Likewise.
(_goacc_profiling_setup_p): Likewise.
* ordered.c (GOMP_doacross_post): Likewise.
(GOMP_doacross_wait): Likewise.
(GOMP_doacross_ull_post): Likewise.
(GOMP_doacross_ull_wait): Likewise.
* parallel.c (gomp_resolve_num_threads): Likewise.
(GOMP_parallel_end): Likewise.
* plugin/plugin-gcn.c (alloc_by_agent): Likewise.
(gcn_exec): Likewise.
(GOMP_OFFLOAD_free): Likewise.
* plugin/plugin-nvptx.c (nvptx_exec): Likewise.
(nvptx_alloc): Likewise.
(nvptx_free): Likewise.
(GOMP_OFFLOAD_openacc_exec): Likewise.
(GOMP_OFFLOAD_openacc_async_exec): Likewise.
* priority_queue.h (priority_queue_multi_p): Likewise.
(priority_tree_insert): Likewise.
* single.c (GOMP_single_start): Likewise.
* target.c (gomp_copy_host2dev): Likewise.
(gomp_copy_dev2host): Likewise.
(GOMP_target_ext): Likewise.
(GOMP_target_update_ext): Likewise.
(GOMP_target_enter_exit_data): Likewise.
* task.c (gomp_task_handle_depend): Likewise.
(GOMP_task): Likewise.
(gomp_create_target_task): Likewise.
(priority_list_downgrade_task): Likewise.
(gomp_task_run_pre): Likewise.
(gomp_task_run_post_handle_dependers): Likewise.
(gomp_task_run_post_remove_parent): Likewise.
(gomp_barrier_handle_tasks): Likewise.
(GOMP_taskwait): Likewise.
(GOMP_taskwait_depend): Likewise.
(gomp_task_maybe_wait_for_dependencies): Likewise.
(GOMP_taskgroup_end): Likewise.
(gomp_reduction_register): Likewise.
(GOMP_taskgroup_reduction_register): Likewise.
(GOMP_task_reduction_remap): Likewise.
* taskloop.c (GOMP_taskloop): Likewise.
* team.c (gomp_team_start): Likewise.
(gomp_team_end): Likewise.
* work.c (INLINE_ORDERED_TEAM_IDS_SIZE): Likewise.
(free_work_share): Likewise.
(gomp_work_share_end): Likewise.
(gomp_work_share_end_cancel): Likewise.
(gomp_work_share_end_nowait): Likewise.
---
libgomp/affinity-fmt.c | 4 +-
libgomp/alloc.c | 2 +-
libgomp/allocator.c | 26 ++++++------
libgomp/config/gcn/bar.c | 20 ++++-----
libgomp/config/gcn/bar.h | 2 +-
libgomp/config/linux/alpha/futex.h | 4 +-
libgomp/config/linux/bar.c | 20 ++++-----
libgomp/config/linux/bar.h | 2 +-
libgomp/config/linux/futex.h | 4 +-
libgomp/config/linux/ia64/futex.h | 4 +-
libgomp/config/linux/lock.c | 2 +-
libgomp/config/linux/mutex.h | 2 +-
libgomp/config/linux/powerpc/futex.h | 6 +--
libgomp/config/linux/s390/futex.h | 4 +-
libgomp/config/linux/sem.c | 3 +-
libgomp/config/linux/sem.h | 2 +-
libgomp/config/linux/sparc/futex.h | 4 +-
libgomp/config/linux/wait.h | 8 ++--
libgomp/config/linux/x86/futex.h | 4 +-
libgomp/config/nvptx/bar.c | 2 +-
libgomp/config/nvptx/bar.h | 2 +-
libgomp/config/posix/bar.h | 2 +-
libgomp/config/posix/pool.h | 2 +-
libgomp/config/rtems/bar.c | 4 +-
libgomp/config/rtems/bar.h | 2 +-
libgomp/config/rtems/pool.h | 4 +-
libgomp/iter.c | 8 ++--
libgomp/iter_ull.c | 22 +++++-----
libgomp/libgomp.h | 11 +++--
libgomp/loop.c | 14 +++----
libgomp/loop_ull.c | 14 +++----
libgomp/oacc-int.h | 3 +-
libgomp/oacc-profiling.c | 8 ++--
libgomp/ordered.c | 32 +++++++-------
libgomp/parallel.c | 4 +-
libgomp/plugin/plugin-gcn.c | 6 +--
libgomp/plugin/plugin-nvptx.c | 10 ++---
libgomp/priority_queue.h | 6 +--
libgomp/single.c | 2 +-
libgomp/target.c | 14 +++----
libgomp/task.c | 62 ++++++++++++++--------------
libgomp/taskloop.c | 6 +--
libgomp/team.c | 42 +++++++++----------
libgomp/work.c | 12 +++---
44 files changed, 209 insertions(+), 208 deletions(-)
diff --git a/libgomp/affinity-fmt.c b/libgomp/affinity-fmt.c
index 30b7ef97322..c9154ca6f1a 100644
--- a/libgomp/affinity-fmt.c
+++ b/libgomp/affinity-fmt.c
@@ -101,7 +101,7 @@ gomp_display_string (char *buffer, size_t size, size_t *ret,
memcpy (buffer + r, str, l);
}
*ret += len;
- if (__builtin_expect (r > *ret, 0))
+ if (UNLIKELY (r > *ret))
gomp_fatal ("overflow in omp_capture_affinity");
}
@@ -118,7 +118,7 @@ gomp_display_repeat (char *buffer, size_t size, size_t *ret,
memset (buffer + r, c, l);
}
*ret += len;
- if (__builtin_expect (r > *ret, 0))
+ if (UNLIKELY (r > *ret))
gomp_fatal ("overflow in omp_capture_affinity");
}
diff --git a/libgomp/alloc.c b/libgomp/alloc.c
index a2a25befdf3..ee5f943967c 100644
--- a/libgomp/alloc.c
+++ b/libgomp/alloc.c
@@ -78,7 +78,7 @@ gomp_aligned_alloc (size_t al, size_t size)
#elif defined(HAVE_ALIGNED_ALLOC)
{
size_t sz = (size + al - 1) & ~(al - 1);
- if (__builtin_expect (sz >= size, 1))
+ if (LIKELY (sz >= size))
ret = aligned_alloc (al, sz);
else
ret = NULL;
diff --git a/libgomp/allocator.c b/libgomp/allocator.c
index 07a5645f4cc..a34e929863f 100644
--- a/libgomp/allocator.c
+++ b/libgomp/allocator.c
@@ -214,7 +214,7 @@ omp_aligned_alloc (size_t alignment, size_t size,
size_t new_size, new_alignment;
void *ptr, *ret;
- if (__builtin_expect (size == 0, 0))
+ if (UNLIKELY (size == 0))
return NULL;
retry:
@@ -246,8 +246,8 @@ retry:
if (__builtin_add_overflow (size, new_size, &new_size))
goto fail;
- if (__builtin_expect (allocator_data
- && allocator_data->pool_size < ~(uintptr_t) 0, 0))
+ if (UNLIKELY (allocator_data
+ && allocator_data->pool_size < ~(uintptr_t) 0))
{
uintptr_t used_pool_size;
if (new_size > allocator_data->pool_size)
@@ -363,7 +363,7 @@ GOMP_alloc (size_t alignment, size_t size, uintptr_t allocator)
void *ret
= ialias_call (omp_aligned_alloc) (alignment, size,
(omp_allocator_handle_t) allocator);
- if (__builtin_expect (ret == NULL, 0) && size)
+ if (UNLIKELY (ret == NULL) && size)
gomp_fatal ("Out of memory allocating %lu bytes",
(unsigned long) size);
return ret;
@@ -413,7 +413,7 @@ omp_aligned_calloc (size_t alignment, size_t nmemb, size_t size,
size_t new_size, size_temp, new_alignment;
void *ptr, *ret;
- if (__builtin_expect (size == 0 || nmemb == 0, 0))
+ if (UNLIKELY (size == 0 || nmemb == 0))
return NULL;
retry:
@@ -447,8 +447,8 @@ retry:
if (__builtin_add_overflow (size_temp, new_size, &new_size))
goto fail;
- if (__builtin_expect (allocator_data
- && allocator_data->pool_size < ~(uintptr_t) 0, 0))
+ if (UNLIKELY (allocator_data
+ && allocator_data->pool_size < ~(uintptr_t) 0))
{
uintptr_t used_pool_size;
if (new_size > allocator_data->pool_size)
@@ -563,10 +563,10 @@ omp_realloc (void *ptr, size_t size, omp_allocator_handle_t allocator,
void *new_ptr, *ret;
struct omp_mem_header *data;
- if (__builtin_expect (ptr == NULL, 0))
+ if (UNLIKELY (ptr == NULL))
return ialias_call (omp_aligned_alloc) (1, size, allocator);
- if (__builtin_expect (size == 0, 0))
+ if (UNLIKELY (size == 0))
{
ialias_call (omp_free) (ptr, free_allocator);
return NULL;
@@ -601,8 +601,8 @@ retry:
goto fail;
old_size = data->size;
- if (__builtin_expect (allocator_data
- && allocator_data->pool_size < ~(uintptr_t) 0, 0))
+ if (UNLIKELY (allocator_data
+ && allocator_data->pool_size < ~(uintptr_t) 0))
{
uintptr_t used_pool_size;
size_t prev_size = 0;
@@ -719,8 +719,8 @@ retry:
if (old_size - old_alignment < size)
size = old_size - old_alignment;
memcpy (ret, ptr, size);
- if (__builtin_expect (free_allocator_data
- && free_allocator_data->pool_size < ~(uintptr_t) 0, 0))
+ if (UNLIKELY (free_allocator_data
+ && free_allocator_data->pool_size < ~(uintptr_t) 0))
{
#ifdef HAVE_SYNC_BUILTINS
__atomic_add_fetch (&free_allocator_data->used_pool_size, -data->size,
diff --git a/libgomp/config/gcn/bar.c b/libgomp/config/gcn/bar.c
index b2aac724641..1e8e5136ea9 100644
--- a/libgomp/config/gcn/bar.c
+++ b/libgomp/config/gcn/bar.c
@@ -36,7 +36,7 @@
void
gomp_barrier_wait_end (gomp_barrier_t *bar, gomp_barrier_state_t state)
{
- if (__builtin_expect (state & BAR_WAS_LAST, 0))
+ if (UNLIKELY (state & BAR_WAS_LAST))
{
/* Next time we'll be awaiting TOTAL threads again. */
bar->awaited = bar->total;
@@ -81,7 +81,7 @@ gomp_team_barrier_wait_end (gomp_barrier_t *bar, gomp_barrier_state_t state)
{
unsigned int generation, gen;
- if (__builtin_expect (state & BAR_WAS_LAST, 0))
+ if (UNLIKELY (state & BAR_WAS_LAST))
{
/* Next time we'll be awaiting TOTAL threads again. */
struct gomp_thread *thr = gomp_thread ();
@@ -89,7 +89,7 @@ gomp_team_barrier_wait_end (gomp_barrier_t *bar, gomp_barrier_state_t state)
bar->awaited = bar->total;
team->work_share_cancelled = 0;
- if (__builtin_expect (team->task_count, 0))
+ if (UNLIKELY (team->task_count))
{
gomp_barrier_handle_tasks (state);
state &= ~BAR_WAS_LAST;
@@ -123,7 +123,7 @@ gomp_team_barrier_wait_end (gomp_barrier_t *bar, gomp_barrier_state_t state)
asm ("s_barrier" ::: "memory");
gen = __atomic_load_n (&bar->generation, MEMMODEL_ACQUIRE);
- if (__builtin_expect (gen & BAR_TASK_PENDING, 0))
+ if (UNLIKELY (gen & BAR_TASK_PENDING))
{
gomp_barrier_handle_tasks (state);
gen = __atomic_load_n (&bar->generation, MEMMODEL_ACQUIRE);
@@ -143,7 +143,7 @@ void
gomp_team_barrier_wait_final (gomp_barrier_t *bar)
{
gomp_barrier_state_t state = gomp_barrier_wait_final_start (bar);
- if (__builtin_expect (state & BAR_WAS_LAST, 0))
+ if (UNLIKELY (state & BAR_WAS_LAST))
bar->awaited_final = bar->total;
gomp_team_barrier_wait_end (bar, state);
}
@@ -154,7 +154,7 @@ gomp_team_barrier_wait_cancel_end (gomp_barrier_t *bar,
{
unsigned int generation, gen;
- if (__builtin_expect (state & BAR_WAS_LAST, 0))
+ if (UNLIKELY (state & BAR_WAS_LAST))
{
/* Next time we'll be awaiting TOTAL threads again. */
/* BAR_CANCELLED should never be set in state here, because
@@ -166,7 +166,7 @@ gomp_team_barrier_wait_cancel_end (gomp_barrier_t *bar,
bar->awaited = bar->total;
team->work_share_cancelled = 0;
- if (__builtin_expect (team->task_count, 0))
+ if (UNLIKELY (team->task_count))
{
gomp_barrier_handle_tasks (state);
state &= ~BAR_WAS_LAST;
@@ -181,7 +181,7 @@ gomp_team_barrier_wait_cancel_end (gomp_barrier_t *bar,
}
}
- if (__builtin_expect (state & BAR_CANCELLED, 0))
+ if (UNLIKELY (state & BAR_CANCELLED))
return true;
generation = state;
@@ -202,9 +202,9 @@ gomp_team_barrier_wait_cancel_end (gomp_barrier_t *bar,
if (bar->total > 1)
asm ("s_barrier" ::: "memory");
gen = __atomic_load_n (&bar->generation, MEMMODEL_RELAXED);
- if (__builtin_expect (gen & BAR_CANCELLED, 0))
+ if (UNLIKELY (gen & BAR_CANCELLED))
return true;
- if (__builtin_expect (gen & BAR_TASK_PENDING, 0))
+ if (UNLIKELY (gen & BAR_TASK_PENDING))
{
gomp_barrier_handle_tasks (state);
gen = __atomic_load_n (&bar->generation, MEMMODEL_RELAXED);
diff --git a/libgomp/config/gcn/bar.h b/libgomp/config/gcn/bar.h
index 19d3a6204bc..a1b18d97cc9 100644
--- a/libgomp/config/gcn/bar.h
+++ b/libgomp/config/gcn/bar.h
@@ -156,7 +156,7 @@ gomp_team_barrier_waiting_for_tasks (gomp_barrier_t *bar)
static inline bool
gomp_team_barrier_cancelled (gomp_barrier_t *bar)
{
- return __builtin_expect ((bar->generation & BAR_CANCELLED) != 0, 0);
+ return UNLIKELY ((bar->generation & BAR_CANCELLED) != 0);
}
static inline void
diff --git a/libgomp/config/linux/alpha/futex.h b/libgomp/config/linux/alpha/futex.h
index 0921c55a16a..ffba4d6ee86 100644
--- a/libgomp/config/linux/alpha/futex.h
+++ b/libgomp/config/linux/alpha/futex.h
@@ -49,7 +49,7 @@ futex_wait (int *addr, int val)
: "0"(sc_0), "r" (sc_16), "r"(sc_17), "r"(sc_18), "1"(sc_19)
: "$1", "$2", "$3", "$4", "$5", "$6", "$7", "$8",
"$22", "$23", "$24", "$25", "$27", "$28", "memory");
- if (__builtin_expect (sc_19, 0) && sc_0 == ENOSYS)
+ if (UNLIKELY (sc_19) && sc_0 == ENOSYS)
{
gomp_futex_wait &= ~FUTEX_PRIVATE_FLAG;
gomp_futex_wake &= ~FUTEX_PRIVATE_FLAG;
@@ -83,7 +83,7 @@ futex_wake (int *addr, int count)
: "0"(sc_0), "r" (sc_16), "r"(sc_17), "r"(sc_18)
: "$1", "$2", "$3", "$4", "$5", "$6", "$7", "$8",
"$22", "$23", "$24", "$25", "$27", "$28", "memory");
- if (__builtin_expect (sc_19, 0) && sc_0 == ENOSYS)
+ if (UNLIKELY (sc_19) && sc_0 == ENOSYS)
{
gomp_futex_wait &= ~FUTEX_PRIVATE_FLAG;
gomp_futex_wake &= ~FUTEX_PRIVATE_FLAG;
diff --git a/libgomp/config/linux/bar.c b/libgomp/config/linux/bar.c
index 159f4182cb8..54705bb5821 100644
--- a/libgomp/config/linux/bar.c
+++ b/libgomp/config/linux/bar.c
@@ -34,7 +34,7 @@
void
gomp_barrier_wait_end (gomp_barrier_t *bar, gomp_barrier_state_t state)
{
- if (__builtin_expect (state & BAR_WAS_LAST, 0))
+ if (UNLIKELY (state & BAR_WAS_LAST))
{
/* Next time we'll be awaiting TOTAL threads again. */
bar->awaited = bar->total;
@@ -82,7 +82,7 @@ gomp_team_barrier_wait_end (gomp_barrier_t *bar, gomp_barrier_state_t state)
{
unsigned int generation, gen;
- if (__builtin_expect (state & BAR_WAS_LAST, 0))
+ if (UNLIKELY (state & BAR_WAS_LAST))
{
/* Next time we'll be awaiting TOTAL threads again. */
struct gomp_thread *thr = gomp_thread ();
@@ -90,7 +90,7 @@ gomp_team_barrier_wait_end (gomp_barrier_t *bar, gomp_barrier_state_t state)
bar->awaited = bar->total;
team->work_share_cancelled = 0;
- if (__builtin_expect (team->task_count, 0))
+ if (UNLIKELY (team->task_count))
{
gomp_barrier_handle_tasks (state);
state &= ~BAR_WAS_LAST;
@@ -111,7 +111,7 @@ gomp_team_barrier_wait_end (gomp_barrier_t *bar, gomp_barrier_state_t state)
{
do_wait ((int *) &bar->generation, generation);
gen = __atomic_load_n (&bar->generation, MEMMODEL_ACQUIRE);
- if (__builtin_expect (gen & BAR_TASK_PENDING, 0))
+ if (UNLIKELY (gen & BAR_TASK_PENDING))
{
gomp_barrier_handle_tasks (state);
gen = __atomic_load_n (&bar->generation, MEMMODEL_ACQUIRE);
@@ -131,7 +131,7 @@ void
gomp_team_barrier_wait_final (gomp_barrier_t *bar)
{
gomp_barrier_state_t state = gomp_barrier_wait_final_start (bar);
- if (__builtin_expect (state & BAR_WAS_LAST, 0))
+ if (UNLIKELY (state & BAR_WAS_LAST))
bar->awaited_final = bar->total;
gomp_team_barrier_wait_end (bar, state);
}
@@ -142,7 +142,7 @@ gomp_team_barrier_wait_cancel_end (gomp_barrier_t *bar,
{
unsigned int generation, gen;
- if (__builtin_expect (state & BAR_WAS_LAST, 0))
+ if (UNLIKELY (state & BAR_WAS_LAST))
{
/* Next time we'll be awaiting TOTAL threads again. */
/* BAR_CANCELLED should never be set in state here, because
@@ -154,7 +154,7 @@ gomp_team_barrier_wait_cancel_end (gomp_barrier_t *bar,
bar->awaited = bar->total;
team->work_share_cancelled = 0;
- if (__builtin_expect (team->task_count, 0))
+ if (UNLIKELY (team->task_count))
{
gomp_barrier_handle_tasks (state);
state &= ~BAR_WAS_LAST;
@@ -168,7 +168,7 @@ gomp_team_barrier_wait_cancel_end (gomp_barrier_t *bar,
}
}
- if (__builtin_expect (state & BAR_CANCELLED, 0))
+ if (UNLIKELY (state & BAR_CANCELLED))
return true;
generation = state;
@@ -176,9 +176,9 @@ gomp_team_barrier_wait_cancel_end (gomp_barrier_t *bar,
{
do_wait ((int *) &bar->generation, generation);
gen = __atomic_load_n (&bar->generation, MEMMODEL_ACQUIRE);
- if (__builtin_expect (gen & BAR_CANCELLED, 0))
+ if (UNLIKELY (gen & BAR_CANCELLED))
return true;
- if (__builtin_expect (gen & BAR_TASK_PENDING, 0))
+ if (UNLIKELY (gen & BAR_TASK_PENDING))
{
gomp_barrier_handle_tasks (state);
gen = __atomic_load_n (&bar->generation, MEMMODEL_ACQUIRE);
diff --git a/libgomp/config/linux/bar.h b/libgomp/config/linux/bar.h
index 85908376301..80b31a7e1f1 100644
--- a/libgomp/config/linux/bar.h
+++ b/libgomp/config/linux/bar.h
@@ -156,7 +156,7 @@ gomp_team_barrier_waiting_for_tasks (gomp_barrier_t *bar)
static inline bool
gomp_team_barrier_cancelled (gomp_barrier_t *bar)
{
- return __builtin_expect ((bar->generation & BAR_CANCELLED) != 0, 0);
+ return UNLIKELY ((bar->generation & BAR_CANCELLED) != 0);
}
static inline void
diff --git a/libgomp/config/linux/futex.h b/libgomp/config/linux/futex.h
index e01bd96d48b..9ed9cec5902 100644
--- a/libgomp/config/linux/futex.h
+++ b/libgomp/config/linux/futex.h
@@ -43,7 +43,7 @@ static inline void
futex_wait (int *addr, int val)
{
int err = syscall (SYS_futex, addr, gomp_futex_wait, val, NULL);
- if (__builtin_expect (err < 0 && errno == ENOSYS, 0))
+ if (UNLIKELY (err < 0 && errno == ENOSYS))
{
gomp_futex_wait &= ~FUTEX_PRIVATE_FLAG;
gomp_futex_wake &= ~FUTEX_PRIVATE_FLAG;
@@ -55,7 +55,7 @@ static inline void
futex_wake (int *addr, int count)
{
int err = syscall (SYS_futex, addr, gomp_futex_wake, count);
- if (__builtin_expect (err < 0 && errno == ENOSYS, 0))
+ if (UNLIKELY (err < 0 && errno == ENOSYS))
{
gomp_futex_wait &= ~FUTEX_PRIVATE_FLAG;
gomp_futex_wake &= ~FUTEX_PRIVATE_FLAG;
diff --git a/libgomp/config/linux/ia64/futex.h b/libgomp/config/linux/ia64/futex.h
index 79e6fc493df..71d014ed55f 100644
--- a/libgomp/config/linux/ia64/futex.h
+++ b/libgomp/config/linux/ia64/futex.h
@@ -62,7 +62,7 @@ static inline void
futex_wait (int *addr, int val)
{
long err = sys_futex0 (addr, gomp_futex_wait, val);
- if (__builtin_expect (err == ENOSYS, 0))
+ if (UNLIKELY (err == ENOSYS))
{
gomp_futex_wait &= ~FUTEX_PRIVATE_FLAG;
gomp_futex_wake &= ~FUTEX_PRIVATE_FLAG;
@@ -74,7 +74,7 @@ static inline void
futex_wake (int *addr, int count)
{
long err = sys_futex0 (addr, gomp_futex_wake, count);
- if (__builtin_expect (err == ENOSYS, 0))
+ if (UNLIKELY (err == ENOSYS))
{
gomp_futex_wait &= ~FUTEX_PRIVATE_FLAG;
gomp_futex_wake &= ~FUTEX_PRIVATE_FLAG;
diff --git a/libgomp/config/linux/lock.c b/libgomp/config/linux/lock.c
index c238e1e78df..9e88277c7e5 100644
--- a/libgomp/config/linux/lock.c
+++ b/libgomp/config/linux/lock.c
@@ -76,7 +76,7 @@ static __thread int tid_cache;
static inline int gomp_tid (void)
{
int tid = tid_cache;
- if (__builtin_expect (tid == 0, 0))
+ if (UNLIKELY (tid == 0))
tid_cache = tid = syscall (SYS_gettid);
return tid;
}
diff --git a/libgomp/config/linux/mutex.h b/libgomp/config/linux/mutex.h
index be38d144e21..e8786d2689e 100644
--- a/libgomp/config/linux/mutex.h
+++ b/libgomp/config/linux/mutex.h
@@ -61,7 +61,7 @@ static inline void
gomp_mutex_unlock (gomp_mutex_t *mutex)
{
int wait = __atomic_exchange_n (mutex, 0, MEMMODEL_RELEASE);
- if (__builtin_expect (wait < 0, 0))
+ if (UNLIKELY (wait < 0))
gomp_mutex_unlock_slow (mutex);
}
#endif /* GOMP_MUTEX_H */
diff --git a/libgomp/config/linux/powerpc/futex.h b/libgomp/config/linux/powerpc/futex.h
index d4c87436561..49afe9b2e19 100644
--- a/libgomp/config/linux/powerpc/futex.h
+++ b/libgomp/config/linux/powerpc/futex.h
@@ -51,7 +51,7 @@ sys_futex0 (int *addr, int op, int val)
: "r"(r0), "r"(r3), "r"(r4), "r"(r5), "r"(r6)
: "r7", "r8", "r9", "r10", "r11", "r12",
"cr0", "ctr", "memory");
- if (__builtin_expect (r0 & (1 << 28), 0))
+ if (UNLIKELY (r0 & (1 << 28)))
return r3;
return 0;
}
@@ -60,7 +60,7 @@ static inline void
futex_wait (int *addr, int val)
{
long err = sys_futex0 (addr, gomp_futex_wait, val);
- if (__builtin_expect (err == ENOSYS, 0))
+ if (UNLIKELY (err == ENOSYS))
{
gomp_futex_wait &= ~FUTEX_PRIVATE_FLAG;
gomp_futex_wake &= ~FUTEX_PRIVATE_FLAG;
@@ -72,7 +72,7 @@ static inline void
futex_wake (int *addr, int count)
{
long err = sys_futex0 (addr, gomp_futex_wake, count);
- if (__builtin_expect (err == ENOSYS, 0))
+ if (UNLIKELY (err == ENOSYS))
{
gomp_futex_wait &= ~FUTEX_PRIVATE_FLAG;
gomp_futex_wake &= ~FUTEX_PRIVATE_FLAG;
diff --git a/libgomp/config/linux/s390/futex.h b/libgomp/config/linux/s390/futex.h
index fb8c6ee832c..935525d2318 100644
--- a/libgomp/config/linux/s390/futex.h
+++ b/libgomp/config/linux/s390/futex.h
@@ -52,7 +52,7 @@ static inline void
futex_wait (int *addr, int val)
{
long err = sys_futex0 (addr, gomp_futex_wait, val);
- if (__builtin_expect (err == -ENOSYS, 0))
+ if (UNLIKELY (err == -ENOSYS))
{
gomp_futex_wait &= ~FUTEX_PRIVATE_FLAG;
gomp_futex_wake &= ~FUTEX_PRIVATE_FLAG;
@@ -64,7 +64,7 @@ static inline void
futex_wake (int *addr, int count)
{
long err = sys_futex0 (addr, gomp_futex_wake, count);
- if (__builtin_expect (err == -ENOSYS, 0))
+ if (UNLIKELY (err == -ENOSYS))
{
gomp_futex_wait &= ~FUTEX_PRIVATE_FLAG;
gomp_futex_wake &= ~FUTEX_PRIVATE_FLAG;
diff --git a/libgomp/config/linux/sem.c b/libgomp/config/linux/sem.c
index b4dc1db9f46..a9c32fef693 100644
--- a/libgomp/config/linux/sem.c
+++ b/libgomp/config/linux/sem.c
@@ -44,8 +44,7 @@ gomp_sem_wait_slow (gomp_sem_t *sem, int count)
break;
}
/* Something changed. If it wasn't the wait flag, we're good to go. */
- else if (__builtin_expect (((count = *sem) & SEM_WAIT) == 0 && count != 0,
- 1))
+ else if (LIKELY (((count = *sem) & SEM_WAIT) == 0 && count != 0))
{
if (__atomic_compare_exchange_n (sem, &count, count - SEM_INC, false,
MEMMODEL_ACQUIRE, MEMMODEL_RELAXED))
diff --git a/libgomp/config/linux/sem.h b/libgomp/config/linux/sem.h
index 5828d16a541..a3c5deb1c09 100644
--- a/libgomp/config/linux/sem.h
+++ b/libgomp/config/linux/sem.h
@@ -80,7 +80,7 @@ gomp_sem_post (gomp_sem_t *sem)
MEMMODEL_RELEASE, MEMMODEL_RELAXED))
continue;
- if (__builtin_expect (count & SEM_WAIT, 0))
+ if (UNLIKELY (count & SEM_WAIT))
gomp_sem_post_slow (sem);
}
diff --git a/libgomp/config/linux/sparc/futex.h b/libgomp/config/linux/sparc/futex.h
index 0d9305fbb89..c5a146062db 100644
--- a/libgomp/config/linux/sparc/futex.h
+++ b/libgomp/config/linux/sparc/futex.h
@@ -68,7 +68,7 @@ static inline void
futex_wait (int *addr, int val)
{
long err = sys_futex0 (addr, gomp_futex_wait, val);
- if (__builtin_expect (err == ENOSYS, 0))
+ if (UNLIKELY (err == ENOSYS))
{
gomp_futex_wait &= ~FUTEX_PRIVATE_FLAG;
gomp_futex_wake &= ~FUTEX_PRIVATE_FLAG;
@@ -80,7 +80,7 @@ static inline void
futex_wake (int *addr, int count)
{
long err = sys_futex0 (addr, gomp_futex_wake, count);
- if (__builtin_expect (err == ENOSYS, 0))
+ if (UNLIKELY (err == ENOSYS))
{
gomp_futex_wait &= ~FUTEX_PRIVATE_FLAG;
gomp_futex_wake &= ~FUTEX_PRIVATE_FLAG;
diff --git a/libgomp/config/linux/wait.h b/libgomp/config/linux/wait.h
index 0ba9db5a4ad..2be7055a93a 100644
--- a/libgomp/config/linux/wait.h
+++ b/libgomp/config/linux/wait.h
@@ -49,12 +49,12 @@ static inline int do_spin (int *addr, int val)
{
unsigned long long i, count = gomp_spin_count_var;
- if (__builtin_expect (__atomic_load_n (&gomp_managed_threads,
- MEMMODEL_RELAXED)
- > gomp_available_cpus, 0))
+ if (UNLIKELY (__atomic_load_n (&gomp_managed_threads,
+ MEMMODEL_RELAXED)
+ > gomp_available_cpus))
count = gomp_throttled_spin_count_var;
for (i = 0; i < count; i++)
- if (__builtin_expect (__atomic_load_n (addr, MEMMODEL_RELAXED) != val, 0))
+ if (UNLIKELY (__atomic_load_n (addr, MEMMODEL_RELAXED) != val))
return 0;
else
cpu_relax ();
diff --git a/libgomp/config/linux/x86/futex.h b/libgomp/config/linux/x86/futex.h
index bdb360dff58..ef2ec713af2 100644
--- a/libgomp/config/linux/x86/futex.h
+++ b/libgomp/config/linux/x86/futex.h
@@ -94,7 +94,7 @@ futex_wait (int *addr, int val)
{
long err = __futex_wait (addr, gomp_futex_wait, val);
- if (__builtin_expect (err == -ENOSYS, 0))
+ if (UNLIKELY (err == -ENOSYS))
{
gomp_futex_wait &= ~FUTEX_PRIVATE_FLAG;
gomp_futex_wake &= ~FUTEX_PRIVATE_FLAG;
@@ -108,7 +108,7 @@ futex_wake (int *addr, int count)
{
long err = __futex_wake (addr, gomp_futex_wake, count);
- if (__builtin_expect (err == -ENOSYS, 0))
+ if (UNLIKELY (err == -ENOSYS))
{
gomp_futex_wait &= ~FUTEX_PRIVATE_FLAG;
gomp_futex_wake &= ~FUTEX_PRIVATE_FLAG;
diff --git a/libgomp/config/nvptx/bar.c b/libgomp/config/nvptx/bar.c
index eee21071f47..5b7be6d60d6 100644
--- a/libgomp/config/nvptx/bar.c
+++ b/libgomp/config/nvptx/bar.c
@@ -59,7 +59,7 @@ futex_wait (int *addr, int val)
gomp_mutex_lock (&bar->lock);
/* Futex semantics: only go to sleep if *addr == val. */
- if (__builtin_expect (__atomic_load_n (addr, MEMMODEL_ACQUIRE) != val, 0))
+ if (UNLIKELY (__atomic_load_n (addr, MEMMODEL_ACQUIRE) != val))
{
gomp_mutex_unlock (&bar->lock);
return;
diff --git a/libgomp/config/nvptx/bar.h b/libgomp/config/nvptx/bar.h
index 28bf7f4d313..ef58c1eef88 100644
--- a/libgomp/config/nvptx/bar.h
+++ b/libgomp/config/nvptx/bar.h
@@ -158,7 +158,7 @@ gomp_team_barrier_waiting_for_tasks (gomp_barrier_t *bar)
static inline bool
gomp_team_barrier_cancelled (gomp_barrier_t *bar)
{
- return __builtin_expect ((bar->generation & BAR_CANCELLED) != 0, 0);
+ return UNLIKELY ((bar->generation & BAR_CANCELLED) != 0);
}
static inline void
diff --git a/libgomp/config/posix/bar.h b/libgomp/config/posix/bar.h
index a1a18eb6147..1e9f1e6e26d 100644
--- a/libgomp/config/posix/bar.h
+++ b/libgomp/config/posix/bar.h
@@ -146,7 +146,7 @@ gomp_team_barrier_waiting_for_tasks (gomp_barrier_t *bar)
static inline bool
gomp_team_barrier_cancelled (gomp_barrier_t *bar)
{
- return __builtin_expect ((bar->generation & BAR_CANCELLED) != 0, 0);
+ return UNLIKELY ((bar->generation & BAR_CANCELLED) != 0);
}
static inline void
diff --git a/libgomp/config/posix/pool.h b/libgomp/config/posix/pool.h
index ddd253d52b5..3202674bb5a 100644
--- a/libgomp/config/posix/pool.h
+++ b/libgomp/config/posix/pool.h
@@ -37,7 +37,7 @@ static inline struct gomp_thread_pool *
gomp_get_thread_pool (struct gomp_thread *thr, unsigned nthreads)
{
struct gomp_thread_pool *pool = thr->thread_pool;
- if (__builtin_expect (pool == NULL, 0))
+ if (UNLIKELY (pool == NULL))
{
pool = gomp_malloc (sizeof (*pool));
pool->threads = NULL;
diff --git a/libgomp/config/rtems/bar.c b/libgomp/config/rtems/bar.c
index ab0c585567d..fa14ccf071c 100644
--- a/libgomp/config/rtems/bar.c
+++ b/libgomp/config/rtems/bar.c
@@ -57,10 +57,10 @@ do_spin (int *addr, int val)
{
unsigned long long i, count = gomp_spin_count_var;
- if (__builtin_expect (gomp_managed_threads > gomp_available_cpus, 0))
+ if (UNLIKELY (gomp_managed_threads > gomp_available_cpus))
count = gomp_throttled_spin_count_var;
for (i = 0; i < count; i++)
- if (__builtin_expect (__atomic_load_n (addr, MEMMODEL_RELAXED) != val, 0))
+ if (UNLIKELY (__atomic_load_n (addr, MEMMODEL_RELAXED) != val))
return 0;
return 1;
}
diff --git a/libgomp/config/rtems/bar.h b/libgomp/config/rtems/bar.h
index 71a3c5c6eff..d8fc632db42 100644
--- a/libgomp/config/rtems/bar.h
+++ b/libgomp/config/rtems/bar.h
@@ -158,7 +158,7 @@ gomp_team_barrier_waiting_for_tasks (gomp_barrier_t *bar)
static inline bool
gomp_team_barrier_cancelled (gomp_barrier_t *bar)
{
- return __builtin_expect ((bar->generation & BAR_CANCELLED) != 0, 0);
+ return UNLIKELY ((bar->generation & BAR_CANCELLED) != 0);
}
static inline void
diff --git a/libgomp/config/rtems/pool.h b/libgomp/config/rtems/pool.h
index 774060a1360..0a3d238948b 100644
--- a/libgomp/config/rtems/pool.h
+++ b/libgomp/config/rtems/pool.h
@@ -74,7 +74,7 @@ static inline struct gomp_thread_pool *
gomp_get_own_thread_pool (struct gomp_thread *thr, unsigned nthreads)
{
struct gomp_thread_pool *pool = thr->thread_pool;
- if (__builtin_expect (pool == NULL, 0))
+ if (UNLIKELY (pool == NULL))
{
pool = gomp_malloc_cleared (sizeof (*pool));
pool->threads_busy = nthreads;
@@ -89,7 +89,7 @@ gomp_get_thread_pool (struct gomp_thread *thr, unsigned nthreads)
struct gomp_thread_pool *pool;
struct gomp_thread_pool_reservoir *res;
- if (__builtin_expect (thr->thread_pool == NULL, 0))
+ if (UNLIKELY (thr->thread_pool == NULL))
pthread_setspecific (gomp_thread_destructor, thr);
res = gomp_get_thread_pool_reservoir ();
diff --git a/libgomp/iter.c b/libgomp/iter.c
index 40e9124b324..ec43c312d3e 100644
--- a/libgomp/iter.c
+++ b/libgomp/iter.c
@@ -191,7 +191,7 @@ gomp_iter_dynamic_next (long *pstart, long *pend)
incr = ws->incr;
chunk = ws->chunk_size;
- if (__builtin_expect (ws->mode, 1))
+ if (LIKELY (ws->mode))
{
long tmp = __sync_fetch_and_add (&ws->next, chunk);
if (incr > 0)
@@ -240,7 +240,7 @@ gomp_iter_dynamic_next (long *pstart, long *pend)
nend = start + chunk;
tmp = __sync_val_compare_and_swap (&ws->next, start, nend);
- if (__builtin_expect (tmp == start, 1))
+ if (LIKELY (tmp == start))
break;
start = tmp;
@@ -319,13 +319,13 @@ gomp_iter_guided_next (long *pstart, long *pend)
if (q < chunk_size)
q = chunk_size;
- if (__builtin_expect (q <= n, 1))
+ if (LIKELY (q <= n))
nend = start + q * incr;
else
nend = end;
tmp = __sync_val_compare_and_swap (&ws->next, start, nend);
- if (__builtin_expect (tmp == start, 1))
+ if (LIKELY (tmp == start))
break;
start = tmp;
diff --git a/libgomp/iter_ull.c b/libgomp/iter_ull.c
index 491af74da40..2d11b4d34e2 100644
--- a/libgomp/iter_ull.c
+++ b/libgomp/iter_ull.c
@@ -67,7 +67,7 @@ gomp_iter_ull_static_next (gomp_ull *pstart, gomp_ull *pend)
return 1;
/* Compute the total number of iterations. */
- if (__builtin_expect (ws->mode, 0) == 0)
+ if (UNLIKELY (ws->mode) == 0)
n = (ws->end_ull - ws->next_ull + ws->incr_ull - 1) / ws->incr_ull;
else
n = (ws->next_ull - ws->end_ull - ws->incr_ull - 1) / -ws->incr_ull;
@@ -108,7 +108,7 @@ gomp_iter_ull_static_next (gomp_ull *pstart, gomp_ull *pend)
/* Otherwise, each thread gets exactly chunk_size iterations
(if available) each time through the loop. */
- if (__builtin_expect (ws->mode, 0) == 0)
+ if (UNLIKELY (ws->mode) == 0)
n = (ws->end_ull - ws->next_ull + ws->incr_ull - 1) / ws->incr_ull;
else
n = (ws->next_ull - ws->end_ull - ws->incr_ull - 1) / -ws->incr_ull;
@@ -159,7 +159,7 @@ gomp_iter_ull_dynamic_next_locked (gomp_ull *pstart, gomp_ull *pend)
chunk = ws->chunk_size_ull;
left = ws->end_ull - start;
- if (__builtin_expect (ws->mode & 2, 0))
+ if (UNLIKELY (ws->mode & 2))
{
if (chunk < left)
chunk = left;
@@ -192,10 +192,10 @@ gomp_iter_ull_dynamic_next (gomp_ull *pstart, gomp_ull *pend)
end = ws->end_ull;
chunk = ws->chunk_size_ull;
- if (__builtin_expect (ws->mode & 1, 1))
+ if (LIKELY (ws->mode & 1))
{
gomp_ull tmp = __sync_fetch_and_add (&ws->next_ull, chunk);
- if (__builtin_expect (ws->mode & 2, 0) == 0)
+ if (UNLIKELY (ws->mode & 2) == 0)
{
if (tmp >= end)
return false;
@@ -228,7 +228,7 @@ gomp_iter_ull_dynamic_next (gomp_ull *pstart, gomp_ull *pend)
if (start == end)
return false;
- if (__builtin_expect (ws->mode & 2, 0))
+ if (UNLIKELY (ws->mode & 2))
{
if (chunk < left)
chunk = left;
@@ -241,7 +241,7 @@ gomp_iter_ull_dynamic_next (gomp_ull *pstart, gomp_ull *pend)
nend = start + chunk;
tmp = __sync_val_compare_and_swap (&ws->next_ull, start, nend);
- if (__builtin_expect (tmp == start, 1))
+ if (LIKELY (tmp == start))
break;
start = tmp;
@@ -272,7 +272,7 @@ gomp_iter_ull_guided_next_locked (gomp_ull *pstart, gomp_ull *pend)
return false;
start = ws->next_ull;
- if (__builtin_expect (ws->mode, 0) == 0)
+ if (UNLIKELY (ws->mode) == 0)
n = (ws->end_ull - start) / ws->incr_ull;
else
n = (start - ws->end_ull) / -ws->incr_ull;
@@ -318,7 +318,7 @@ gomp_iter_ull_guided_next (gomp_ull *pstart, gomp_ull *pend)
if (start == end)
return false;
- if (__builtin_expect (ws->mode, 0) == 0)
+ if (UNLIKELY (ws->mode) == 0)
n = (end - start) / incr;
else
n = (start - end) / -incr;
@@ -326,13 +326,13 @@ gomp_iter_ull_guided_next (gomp_ull *pstart, gomp_ull *pend)
if (q < chunk_size)
q = chunk_size;
- if (__builtin_expect (q <= n, 1))
+ if (LIKELY (q <= n))
nend = start + q * incr;
else
nend = end;
tmp = __sync_val_compare_and_swap (&ws->next_ull, start, nend);
- if (__builtin_expect (tmp == start, 1))
+ if (LIKELY (tmp == start))
break;
start = tmp;
diff --git a/libgomp/libgomp.h b/libgomp/libgomp.h
index 74487e540d3..23e1fb72283 100644
--- a/libgomp/libgomp.h
+++ b/libgomp/libgomp.h
@@ -73,6 +73,9 @@
# pragma GCC visibility push(hidden)
#endif
+#define LIKELY(x) (__builtin_expect ((x), 1))
+#define UNLIKELY(x) (__builtin_expect ((x), 0))
+
/* If we were a C++ library, we'd get this from <std/atomic>. */
enum memmodel
{
@@ -180,12 +183,12 @@ extern void gomp_debug (int, const char *, ...)
__attribute__ ((format (printf, 2, 3)));
#define gomp_vdebug(KIND, FMT, VALIST) \
do { \
- if (__builtin_expect (gomp_debug_var, 0)) \
+ if (UNLIKELY (gomp_debug_var)) \
(gomp_vdebug) ((KIND), (FMT), (VALIST)); \
} while (0)
#define gomp_debug(KIND, ...) \
do { \
- if (__builtin_expect (gomp_debug_var, 0)) \
+ if (UNLIKELY (gomp_debug_var)) \
(gomp_debug) ((KIND), __VA_ARGS__); \
} while (0)
extern void gomp_verror (const char *, va_list);
@@ -996,7 +999,7 @@ extern void gomp_workshare_task_reduction_register (uintptr_t *, uintptr_t *);
static void inline
gomp_finish_task (struct gomp_task *task)
{
- if (__builtin_expect (task->depend_hash != NULL, 0))
+ if (UNLIKELY (task->depend_hash != NULL))
free (task->depend_hash);
}
@@ -1316,7 +1319,7 @@ static inline void
gomp_work_share_init_done (void)
{
struct gomp_thread *thr = gomp_thread ();
- if (__builtin_expect (thr->ts.last_work_share != NULL, 1))
+ if (LIKELY (thr->ts.last_work_share != NULL))
gomp_ptrlock_set (&thr->ts.last_work_share->next_ws, thr->ts.work_share);
}
diff --git a/libgomp/loop.c b/libgomp/loop.c
index be85162bb1e..2b548b5f04f 100644
--- a/libgomp/loop.c
+++ b/libgomp/loop.c
@@ -59,21 +59,21 @@ gomp_loop_init (struct gomp_work_share *ws, long start, long end, long incr,
struct gomp_team *team = thr->ts.team;
long nthreads = team ? team->nthreads : 1;
- if (__builtin_expect (incr > 0, 1))
+ if (LIKELY (incr > 0))
{
/* Cheap overflow protection. */
- if (__builtin_expect ((nthreads | ws->chunk_size)
- >= 1UL << (sizeof (long)
- * __CHAR_BIT__ / 2 - 1), 0))
+ if (UNLIKELY ((nthreads | ws->chunk_size)
+ >= 1UL << (sizeof (long)
+ * __CHAR_BIT__ / 2 - 1)))
ws->mode = 0;
else
ws->mode = ws->end < (LONG_MAX
- (nthreads + 1) * ws->chunk_size);
}
/* Cheap overflow protection. */
- else if (__builtin_expect ((nthreads | -ws->chunk_size)
- >= 1UL << (sizeof (long)
- * __CHAR_BIT__ / 2 - 1), 0))
+ else if (UNLIKELY ((nthreads | -ws->chunk_size)
+ >= 1UL << (sizeof (long)
+ * __CHAR_BIT__ / 2 - 1)))
ws->mode = 0;
else
ws->mode = ws->end > (nthreads + 1) * -ws->chunk_size - LONG_MAX;
diff --git a/libgomp/loop_ull.c b/libgomp/loop_ull.c
index 602737296d4..167a53e16f7 100644
--- a/libgomp/loop_ull.c
+++ b/libgomp/loop_ull.c
@@ -62,19 +62,19 @@ gomp_loop_ull_init (struct gomp_work_share *ws, bool up, gomp_ull start,
struct gomp_team *team = thr->ts.team;
long nthreads = team ? team->nthreads : 1;
- if (__builtin_expect (up, 1))
+ if (LIKELY (up))
{
/* Cheap overflow protection. */
- if (__builtin_expect ((nthreads | ws->chunk_size_ull)
- < 1ULL << (sizeof (gomp_ull)
- * __CHAR_BIT__ / 2 - 1), 1))
+ if (LIKELY ((nthreads | ws->chunk_size_ull)
+ < 1ULL << (sizeof (gomp_ull)
+ * __CHAR_BIT__ / 2 - 1)))
ws->mode = ws->end_ull < (__LONG_LONG_MAX__ * 2ULL + 1
- (nthreads + 1) * ws->chunk_size_ull);
}
/* Cheap overflow protection. */
- else if (__builtin_expect ((nthreads | -ws->chunk_size_ull)
- < 1ULL << (sizeof (gomp_ull)
- * __CHAR_BIT__ / 2 - 1), 1))
+ else if (LIKELY ((nthreads | -ws->chunk_size_ull)
+ < 1ULL << (sizeof (gomp_ull)
+ * __CHAR_BIT__ / 2 - 1)))
ws->mode = ws->end_ull > ((nthreads + 1) * -ws->chunk_size_ull
- (__LONG_LONG_MAX__ * 2ULL + 1));
}
diff --git a/libgomp/oacc-int.h b/libgomp/oacc-int.h
index 2642be957ce..e5ef35f7862 100644
--- a/libgomp/oacc-int.h
+++ b/libgomp/oacc-int.h
@@ -147,8 +147,7 @@ async_synchronous_p (int async)
extern bool goacc_prof_enabled;
/* Tune for the (very common) case that profiling is not enabled. */
#define GOACC_PROF_ENABLED \
- (__builtin_expect (__atomic_load_n (&goacc_prof_enabled, \
- MEMMODEL_ACQUIRE) == true, false))
+ (UNLIKELY (__atomic_load_n (&goacc_prof_enabled, MEMMODEL_ACQUIRE) == true))
void goacc_profiling_initialize (void);
bool _goacc_profiling_dispatch_p (bool);
diff --git a/libgomp/oacc-profiling.c b/libgomp/oacc-profiling.c
index 3df6eeba1c0..220cdad6233 100644
--- a/libgomp/oacc-profiling.c
+++ b/libgomp/oacc-profiling.c
@@ -504,7 +504,7 @@ _goacc_profiling_dispatch_p (bool check_not_nested_p)
bool ret;
struct goacc_thread *thr = goacc_thread ();
- if (__builtin_expect (thr == NULL, false))
+ if (UNLIKELY (thr == NULL))
{
/* If we don't have any per-thread state yet, that means that per-thread
callback dispatch has not been explicitly disabled (which only a call
@@ -523,7 +523,7 @@ _goacc_profiling_dispatch_p (bool check_not_nested_p)
assert (thr->api_info == NULL);
}
- if (__builtin_expect (!thr->prof_callbacks_enabled, true))
+ if (LIKELY (!thr->prof_callbacks_enabled))
{
gomp_debug (0, " %s: disabled for this thread\n", __FUNCTION__);
ret = false;
@@ -534,7 +534,7 @@ _goacc_profiling_dispatch_p (bool check_not_nested_p)
gomp_mutex_lock (&goacc_prof_lock);
/* 'goacc_prof_callbacks_enabled[acc_ev_none]' acts as a global toggle. */
- if (__builtin_expect (!goacc_prof_callbacks_enabled[acc_ev_none], true))
+ if (LIKELY (!goacc_prof_callbacks_enabled[acc_ev_none]))
{
gomp_debug (0, " %s: disabled globally\n", __FUNCTION__);
ret = false;
@@ -560,7 +560,7 @@ _goacc_profiling_setup_p (struct goacc_thread *thr,
/* If we don't have any per-thread state yet, we can't register 'prof_info'
and 'api_info'. */
- if (__builtin_expect (thr == NULL, false))
+ if (UNLIKELY (thr == NULL))
{
gomp_debug (0, "Can't dispatch OpenACC Profiling Interface events for"
" the current call, construct, or directive\n");
diff --git a/libgomp/ordered.c b/libgomp/ordered.c
index ca5cf09efec..3df3443c487 100644
--- a/libgomp/ordered.c
+++ b/libgomp/ordered.c
@@ -379,14 +379,14 @@ GOMP_doacross_post (long *counts)
unsigned long ent;
unsigned int i;
- if (__builtin_expect (doacross == NULL, 0)
- || __builtin_expect (doacross->array == NULL, 0))
+ if (UNLIKELY (doacross == NULL)
+ || UNLIKELY (doacross->array == NULL))
{
__sync_synchronize ();
return;
}
- if (__builtin_expect (ws->sched == GFS_STATIC, 1))
+ if (LIKELY (ws->sched == GFS_STATIC))
ent = thr->ts.team_id;
else if (ws->sched == GFS_GUIDED)
ent = counts[0];
@@ -395,7 +395,7 @@ GOMP_doacross_post (long *counts)
unsigned long *array = (unsigned long *) (doacross->array
+ ent * doacross->elt_sz);
- if (__builtin_expect (doacross->flattened, 1))
+ if (LIKELY (doacross->flattened))
{
unsigned long flattened
= (unsigned long) counts[0] << doacross->shift_counts[0];
@@ -431,14 +431,14 @@ GOMP_doacross_wait (long first, ...)
unsigned long ent;
unsigned int i;
- if (__builtin_expect (doacross == NULL, 0)
- || __builtin_expect (doacross->array == NULL, 0))
+ if (UNLIKELY (doacross == NULL)
+ || UNLIKELY (doacross->array == NULL))
{
__sync_synchronize ();
return;
}
- if (__builtin_expect (ws->sched == GFS_STATIC, 1))
+ if (LIKELY (ws->sched == GFS_STATIC))
{
if (ws->chunk_size == 0)
{
@@ -458,7 +458,7 @@ GOMP_doacross_wait (long first, ...)
unsigned long *array = (unsigned long *) (doacross->array
+ ent * doacross->elt_sz);
- if (__builtin_expect (doacross->flattened, 1))
+ if (LIKELY (doacross->flattened))
{
unsigned long flattened
= (unsigned long) first << doacross->shift_counts[0];
@@ -635,21 +635,21 @@ GOMP_doacross_ull_post (gomp_ull *counts)
unsigned long ent;
unsigned int i;
- if (__builtin_expect (doacross == NULL, 0)
- || __builtin_expect (doacross->array == NULL, 0))
+ if (UNLIKELY (doacross == NULL)
+ || UNLIKELY (doacross->array == NULL))
{
__sync_synchronize ();
return;
}
- if (__builtin_expect (ws->sched == GFS_STATIC, 1))
+ if (LIKELY (ws->sched == GFS_STATIC))
ent = thr->ts.team_id;
else if (ws->sched == GFS_GUIDED)
ent = counts[0];
else
ent = counts[0] / doacross->chunk_size_ull;
- if (__builtin_expect (doacross->flattened, 1))
+ if (LIKELY (doacross->flattened))
{
unsigned long *array = (unsigned long *) (doacross->array
+ ent * doacross->elt_sz);
@@ -708,14 +708,14 @@ GOMP_doacross_ull_wait (gomp_ull first, ...)
unsigned long ent;
unsigned int i;
- if (__builtin_expect (doacross == NULL, 0)
- || __builtin_expect (doacross->array == NULL, 0))
+ if (UNLIKELY (doacross == NULL)
+ || UNLIKELY (doacross->array == NULL))
{
__sync_synchronize ();
return;
}
- if (__builtin_expect (ws->sched == GFS_STATIC, 1))
+ if (LIKELY (ws->sched == GFS_STATIC))
{
if (ws->chunk_size_ull == 0)
{
@@ -733,7 +733,7 @@ GOMP_doacross_ull_wait (gomp_ull first, ...)
else
ent = first / doacross->chunk_size_ull;
- if (__builtin_expect (doacross->flattened, 1))
+ if (LIKELY (doacross->flattened))
{
unsigned long *array = (unsigned long *) (doacross->array
+ ent * doacross->elt_sz);
diff --git a/libgomp/parallel.c b/libgomp/parallel.c
index f7722990566..26fc351fd58 100644
--- a/libgomp/parallel.c
+++ b/libgomp/parallel.c
@@ -82,7 +82,7 @@ gomp_resolve_num_threads (unsigned specified, unsigned count)
}
/* UINT_MAX stands for infinity. */
- if (__builtin_expect (icv->thread_limit_var == UINT_MAX, 1)
+ if (LIKELY (icv->thread_limit_var == UINT_MAX)
|| max_num_threads == 1)
return max_num_threads;
@@ -138,7 +138,7 @@ void
GOMP_parallel_end (void)
{
struct gomp_task_icv *icv = gomp_icv (false);
- if (__builtin_expect (icv->thread_limit_var != UINT_MAX, 0))
+ if (UNLIKELY (icv->thread_limit_var != UINT_MAX))
{
struct gomp_thread *thr = gomp_thread ();
struct gomp_team *team = thr->ts.team;
diff --git a/libgomp/plugin/plugin-gcn.c b/libgomp/plugin/plugin-gcn.c
index 1c0436842da..8b49d4e0f40 100644
--- a/libgomp/plugin/plugin-gcn.c
+++ b/libgomp/plugin/plugin-gcn.c
@@ -1838,7 +1838,7 @@ alloc_by_agent (struct agent_info *agent, size_t size)
struct goacc_thread *thr = GOMP_PLUGIN_goacc_thread ();
bool profiling_dispatch_p
- = __builtin_expect (thr != NULL && thr->prof_info != NULL, false);
+ = UNLIKELY (thr != NULL && thr->prof_info != NULL);
if (profiling_dispatch_p)
{
acc_prof_info *prof_info = thr->prof_info;
@@ -3131,7 +3131,7 @@ gcn_exec (struct kernel_info *kernel, size_t mapnum, void **hostaddrs,
acc_prof_info *prof_info = thr->prof_info;
acc_event_info enqueue_launch_event_info;
acc_api_info *api_info = thr->api_info;
- bool profiling_dispatch_p = __builtin_expect (prof_info != NULL, false);
+ bool profiling_dispatch_p = UNLIKELY (prof_info != NULL);
if (profiling_dispatch_p)
{
prof_info->event_type = acc_ev_enqueue_launch_start;
@@ -3671,7 +3671,7 @@ GOMP_OFFLOAD_free (int device, void *ptr)
struct goacc_thread *thr = GOMP_PLUGIN_goacc_thread ();
bool profiling_dispatch_p
- = __builtin_expect (thr != NULL && thr->prof_info != NULL, false);
+ = UNLIKELY (thr != NULL && thr->prof_info != NULL);
if (profiling_dispatch_p)
{
acc_prof_info *prof_info = thr->prof_info;
diff --git a/libgomp/plugin/plugin-nvptx.c b/libgomp/plugin/plugin-nvptx.c
index 387bcbbc52a..e7ee186b434 100644
--- a/libgomp/plugin/plugin-nvptx.c
+++ b/libgomp/plugin/plugin-nvptx.c
@@ -949,7 +949,7 @@ nvptx_exec (void (*fn), size_t mapnum, void **hostaddrs, void **devaddrs,
acc_prof_info *prof_info = thr->prof_info;
acc_event_info enqueue_launch_event_info;
acc_api_info *api_info = thr->api_info;
- bool profiling_p = __builtin_expect (prof_info != NULL, false);
+ bool profiling_p = UNLIKELY (prof_info != NULL);
if (profiling_p)
{
prof_info->event_type = acc_ev_enqueue_launch_start;
@@ -1057,7 +1057,7 @@ nvptx_alloc (size_t s, bool suppress_errors)
/* NOTE: We only do profiling stuff if the memory allocation succeeds. */
struct goacc_thread *thr = GOMP_PLUGIN_goacc_thread ();
bool profiling_p
- = __builtin_expect (thr != NULL && thr->prof_info != NULL, false);
+ = UNLIKELY (thr != NULL && thr->prof_info != NULL);
if (profiling_p)
goacc_profiling_acc_ev_alloc (thr, (void *) d, s);
@@ -1125,7 +1125,7 @@ nvptx_free (void *p, struct ptx_device *ptx_dev)
CUDA_CALL (cuMemFree, (CUdeviceptr) p);
struct goacc_thread *thr = GOMP_PLUGIN_goacc_thread ();
bool profiling_p
- = __builtin_expect (thr != NULL && thr->prof_info != NULL, false);
+ = UNLIKELY (thr != NULL && thr->prof_info != NULL);
if (profiling_p)
goacc_profiling_acc_ev_free (thr, p);
@@ -1460,7 +1460,7 @@ GOMP_OFFLOAD_openacc_exec (void (*fn) (void *), size_t mapnum,
acc_prof_info *prof_info = thr->prof_info;
acc_event_info data_event_info;
acc_api_info *api_info = thr->api_info;
- bool profiling_p = __builtin_expect (prof_info != NULL, false);
+ bool profiling_p = UNLIKELY (prof_info != NULL);
void **hp = NULL;
CUdeviceptr dp = 0;
@@ -1548,7 +1548,7 @@ GOMP_OFFLOAD_openacc_async_exec (void (*fn) (void *), size_t mapnum,
acc_prof_info *prof_info = thr->prof_info;
acc_event_info data_event_info;
acc_api_info *api_info = thr->api_info;
- bool profiling_p = __builtin_expect (prof_info != NULL, false);
+ bool profiling_p = UNLIKELY (prof_info != NULL);
void **hp = NULL;
CUdeviceptr dp = 0;
diff --git a/libgomp/priority_queue.h b/libgomp/priority_queue.h
index e032d0799f3..93bfc4faf0c 100644
--- a/libgomp/priority_queue.h
+++ b/libgomp/priority_queue.h
@@ -143,7 +143,7 @@ extern struct gomp_task *priority_tree_next_task (enum priority_queue_type,
static inline bool
priority_queue_multi_p (struct priority_queue *head)
{
- return __builtin_expect (head->t.root != NULL, 0);
+ return UNLIKELY (head->t.root != NULL);
}
/* Initialize a priority queue. */
@@ -300,7 +300,7 @@ priority_tree_insert (enum priority_queue_type type,
bool adjust_parent_depends_on,
bool task_is_parent_depends_on)
{
- if (__builtin_expect (head->t.root == NULL, 0))
+ if (UNLIKELY (head->t.root == NULL))
{
/* The first time around, transfer any priority 0 items to the
tree. */
@@ -349,7 +349,7 @@ priority_queue_insert (enum priority_queue_type type,
if (priority_queue_task_in_queue_p (type, head, task))
gomp_fatal ("Attempt to insert existing task %p", task);
#endif
- if (priority_queue_multi_p (head) || __builtin_expect (priority > 0, 0))
+ if (priority_queue_multi_p (head) || UNLIKELY (priority > 0))
priority_tree_insert (type, head, task, priority, pos,
adjust_parent_depends_on,
task_is_parent_depends_on);
diff --git a/libgomp/single.c b/libgomp/single.c
index 79a3f8eb4b6..ca30893db12 100644
--- a/libgomp/single.c
+++ b/libgomp/single.c
@@ -40,7 +40,7 @@ GOMP_single_start (void)
struct gomp_team *team = thr->ts.team;
unsigned long single_count;
- if (__builtin_expect (team == NULL, 0))
+ if (UNLIKELY (team == NULL))
return true;
single_count = thr->ts.single_count++;
diff --git a/libgomp/target.c b/libgomp/target.c
index 4740f8a45d3..96993ab260a 100644
--- a/libgomp/target.c
+++ b/libgomp/target.c
@@ -348,7 +348,7 @@ gomp_copy_host2dev (struct gomp_device_descr *devicep,
void *d, const void *h, size_t sz,
bool ephemeral, struct gomp_coalesce_buf *cbuf)
{
- if (__builtin_expect (aq != NULL, 0))
+ if (UNLIKELY (aq != NULL))
{
/* See 'gomp_coalesce_buf_add'. */
assert (!cbuf);
@@ -409,7 +409,7 @@ gomp_copy_dev2host (struct gomp_device_descr *devicep,
struct goacc_asyncqueue *aq,
void *h, const void *d, size_t sz)
{
- if (__builtin_expect (aq != NULL, 0))
+ if (UNLIKELY (aq != NULL))
goacc_device_copy_async (devicep, devicep->openacc.async.dev2host_func,
"host", h, "dev", d, NULL, sz, aq);
else
@@ -2659,7 +2659,7 @@ GOMP_target_ext (int device, void (*fn) (void *), size_t mapnum,
/* Create a team if we don't have any around, as nowait
target tasks make sense to run asynchronously even when
outside of any parallel. */
- if (__builtin_expect (thr->ts.team == NULL, 0))
+ if (UNLIKELY (thr->ts.team == NULL))
{
struct gomp_team *team = gomp_new_team (1);
struct gomp_task *task = thr->task;
@@ -2898,7 +2898,7 @@ GOMP_target_update_ext (int device, size_t mapnum, void **hostaddrs,
struct gomp_team *team = thr->ts.team;
/* If parallel or taskgroup has been cancelled, don't start new
tasks. */
- if (__builtin_expect (gomp_cancel_var, 0) && team)
+ if (UNLIKELY (gomp_cancel_var) && team)
{
if (gomp_team_barrier_cancelled (&team->barrier))
return;
@@ -2926,7 +2926,7 @@ GOMP_target_update_ext (int device, size_t mapnum, void **hostaddrs,
struct gomp_thread *thr = gomp_thread ();
struct gomp_team *team = thr->ts.team;
/* If parallel or taskgroup has been cancelled, don't start new tasks. */
- if (__builtin_expect (gomp_cancel_var, 0) && team)
+ if (UNLIKELY (gomp_cancel_var) && team)
{
if (gomp_team_barrier_cancelled (&team->barrier))
return;
@@ -3091,7 +3091,7 @@ GOMP_target_enter_exit_data (int device, size_t mapnum, void **hostaddrs,
struct gomp_team *team = thr->ts.team;
/* If parallel or taskgroup has been cancelled, don't start new
tasks. */
- if (__builtin_expect (gomp_cancel_var, 0) && team)
+ if (UNLIKELY (gomp_cancel_var) && team)
{
if (gomp_team_barrier_cancelled (&team->barrier))
return;
@@ -3119,7 +3119,7 @@ GOMP_target_enter_exit_data (int device, size_t mapnum, void **hostaddrs,
struct gomp_thread *thr = gomp_thread ();
struct gomp_team *team = thr->ts.team;
/* If parallel or taskgroup has been cancelled, don't start new tasks. */
- if (__builtin_expect (gomp_cancel_var, 0) && team)
+ if (UNLIKELY (gomp_cancel_var) && team)
{
if (gomp_team_barrier_cancelled (&team->barrier))
return;
diff --git a/libgomp/task.c b/libgomp/task.c
index 30cd046df2a..282dc451eff 100644
--- a/libgomp/task.c
+++ b/libgomp/task.c
@@ -238,7 +238,7 @@ gomp_task_handle_depend (struct gomp_task *task, struct gomp_task *parent,
}
}
task->num_dependees = 0;
- if (__builtin_expect (parent->depend_all_memory && ndepend, false))
+ if (UNLIKELY (parent->depend_all_memory && ndepend))
{
struct gomp_task *tsk = parent->depend_all_memory;
if (tsk->dependers == NULL)
@@ -266,7 +266,7 @@ gomp_task_handle_depend (struct gomp_task *task, struct gomp_task *parent,
}
task->num_dependees++;
}
- if (__builtin_expect (all_memory, false))
+ if (UNLIKELY (all_memory))
{
/* A task with depend(inout: omp_all_memory) depends on all previous
sibling tasks which have any dependencies and all later sibling
@@ -509,7 +509,7 @@ GOMP_task (void (*fn) (void *), void *data, void (*cpyfn) (void *, void *),
#endif
/* If parallel or taskgroup has been cancelled, don't start new tasks. */
- if (__builtin_expect (gomp_cancel_var, 0) && team)
+ if (UNLIKELY (gomp_cancel_var) && team)
{
if (gomp_team_barrier_cancelled (&team->barrier))
return;
@@ -524,7 +524,7 @@ GOMP_task (void (*fn) (void *), void *data, void (*cpyfn) (void *, void *),
}
}
- if (__builtin_expect ((flags & GOMP_TASK_FLAG_PRIORITY) != 0, 0))
+ if (UNLIKELY ((flags & GOMP_TASK_FLAG_PRIORITY) != 0))
{
priority = priority_arg;
if (priority > gomp_max_task_priority_var)
@@ -572,7 +572,7 @@ GOMP_task (void (*fn) (void *), void *data, void (*cpyfn) (void *, void *),
task.taskgroup = thr->task->taskgroup;
}
thr->task = &task;
- if (__builtin_expect (cpyfn != NULL, 0))
+ if (UNLIKELY (cpyfn != NULL))
{
char buf[arg_size + arg_align - 1];
char *arg = (char *) (((uintptr_t) buf + arg_align - 1)
@@ -654,7 +654,7 @@ GOMP_task (void (*fn) (void *), void *data, void (*cpyfn) (void *, void *),
gomp_mutex_lock (&team->task_lock);
/* If parallel or taskgroup has been cancelled, don't start new
tasks. */
- if (__builtin_expect (gomp_cancel_var, 0)
+ if (UNLIKELY (gomp_cancel_var)
&& !task->copy_ctors_done)
{
if (gomp_team_barrier_cancelled (&team->barrier))
@@ -694,7 +694,7 @@ GOMP_task (void (*fn) (void *), void *data, void (*cpyfn) (void *, void *),
}
/* Check for taskwait nowait depend which doesn't need to wait for
anything. */
- if (__builtin_expect (fn == empty_task, 0))
+ if (UNLIKELY (fn == empty_task))
{
if (taskgroup)
taskgroup->num_children--;
@@ -875,7 +875,7 @@ gomp_create_target_task (struct gomp_device_descr *devicep,
struct gomp_team *team = thr->ts.team;
/* If parallel or taskgroup has been cancelled, don't start new tasks. */
- if (__builtin_expect (gomp_cancel_var, 0) && team)
+ if (UNLIKELY (gomp_cancel_var) && team)
{
if (gomp_team_barrier_cancelled (&team->barrier))
return true;
@@ -993,7 +993,7 @@ gomp_create_target_task (struct gomp_device_descr *devicep,
task->final_task = 0;
gomp_mutex_lock (&team->task_lock);
/* If parallel or taskgroup has been cancelled, don't start new tasks. */
- if (__builtin_expect (gomp_cancel_var, 0))
+ if (UNLIKELY (gomp_cancel_var))
{
if (gomp_team_barrier_cancelled (&team->barrier))
{
@@ -1216,7 +1216,7 @@ priority_list_downgrade_task (enum priority_queue_type type,
/* If the current task is the last_parent_depends_on for its
priority, adjust last_parent_depends_on appropriately. */
- if (__builtin_expect (child_task->parent_depends_on, 0)
+ if (UNLIKELY (child_task->parent_depends_on)
&& list->last_parent_depends_on == node)
{
struct gomp_task *prev_child = priority_node_to_task (type, node->prev);
@@ -1304,7 +1304,7 @@ gomp_task_run_pre (struct gomp_task *child_task, struct gomp_task *parent,
if (--team->task_queued_count == 0)
gomp_team_barrier_clear_task_pending (&team->barrier);
- if (__builtin_expect (gomp_cancel_var, 0)
+ if (UNLIKELY (gomp_cancel_var)
&& !child_task->copy_ctors_done)
{
if (gomp_team_barrier_cancelled (&team->barrier))
@@ -1378,11 +1378,11 @@ gomp_task_run_post_handle_dependers (struct gomp_task *child_task,
continue;
struct gomp_taskgroup *taskgroup = task->taskgroup;
- if (__builtin_expect (task->fn == empty_task, 0))
+ if (UNLIKELY (task->fn == empty_task))
{
if (!parent)
task->parent = NULL;
- else if (__builtin_expect (task->parent_depends_on, 0)
+ else if (UNLIKELY (task->parent_depends_on)
&& --parent->taskwait->n_depend == 0
&& parent->taskwait->in_depend_wait)
{
@@ -1498,7 +1498,7 @@ gomp_task_run_post_remove_parent (struct gomp_task *child_task)
/* If this was the last task the parent was depending on,
synchronize with gomp_task_maybe_wait_for_dependencies so it can
clean up and return. */
- if (__builtin_expect (child_task->parent_depends_on, 0)
+ if (UNLIKELY (child_task->parent_depends_on)
&& --parent->taskwait->n_depend == 0
&& parent->taskwait->in_depend_wait)
{
@@ -1584,7 +1584,7 @@ gomp_barrier_handle_tasks (gomp_barrier_state_t state)
&ignored);
cancelled = gomp_task_run_pre (child_task, child_task->parent,
team);
- if (__builtin_expect (cancelled, 0))
+ if (UNLIKELY (cancelled))
{
if (to_free)
{
@@ -1625,7 +1625,7 @@ gomp_barrier_handle_tasks (gomp_barrier_state_t state)
if (child_task)
{
thr->task = child_task;
- if (__builtin_expect (child_task->fn == NULL, 0))
+ if (UNLIKELY (child_task->fn == NULL))
{
if (gomp_target_task_fn (child_task->fn_data))
{
@@ -1743,7 +1743,7 @@ GOMP_taskwait (void)
child_task = next_task;
cancelled
= gomp_task_run_pre (child_task, task, team);
- if (__builtin_expect (cancelled, 0))
+ if (UNLIKELY (cancelled))
{
if (to_free)
{
@@ -1784,7 +1784,7 @@ GOMP_taskwait (void)
if (child_task)
{
thr->task = child_task;
- if (__builtin_expect (child_task->fn == NULL, 0))
+ if (UNLIKELY (child_task->fn == NULL))
{
if (gomp_target_task_fn (child_task->fn_data))
{
@@ -1866,7 +1866,7 @@ GOMP_taskwait_depend (void **depend)
struct gomp_team *team = thr->ts.team;
/* If parallel or taskgroup has been cancelled, return early. */
- if (__builtin_expect (gomp_cancel_var, 0) && team)
+ if (UNLIKELY (gomp_cancel_var) && team)
{
if (gomp_team_barrier_cancelled (&team->barrier))
return;
@@ -1935,7 +1935,7 @@ gomp_task_maybe_wait_for_dependencies (void **depend)
n = 5;
}
gomp_mutex_lock (&team->task_lock);
- if (__builtin_expect (task->depend_all_memory && ndepend, false))
+ if (UNLIKELY (task->depend_all_memory && ndepend))
{
struct gomp_task *tsk = task->depend_all_memory;
if (!tsk->parent_depends_on)
@@ -1950,7 +1950,7 @@ gomp_task_maybe_wait_for_dependencies (void **depend)
{
elem.addr = depend[i + n];
elem.is_in = i >= nout;
- if (__builtin_expect (i >= normal, 0))
+ if (UNLIKELY (i >= normal))
{
void **d = (void **) elem.addr;
switch ((uintptr_t) d[1])
@@ -1971,7 +1971,7 @@ gomp_task_maybe_wait_for_dependencies (void **depend)
}
elem.addr = d[0];
}
- if (__builtin_expect (elem.addr == NULL && !elem.is_in, false))
+ if (UNLIKELY (elem.addr == NULL && !elem.is_in))
{
size_t size = htab_size (task->depend_hash);
if (htab_elements (task->depend_hash) * 8 < size && size > 32)
@@ -2070,7 +2070,7 @@ gomp_task_maybe_wait_for_dependencies (void **depend)
child_task = next_task;
cancelled
= gomp_task_run_pre (child_task, task, team);
- if (__builtin_expect (cancelled, 0))
+ if (UNLIKELY (cancelled))
{
if (to_free)
{
@@ -2102,7 +2102,7 @@ gomp_task_maybe_wait_for_dependencies (void **depend)
if (child_task)
{
thr->task = child_task;
- if (__builtin_expect (child_task->fn == NULL, 0))
+ if (UNLIKELY (child_task->fn == NULL))
{
if (gomp_target_task_fn (child_task->fn_data))
{
@@ -2212,7 +2212,7 @@ GOMP_taskgroup_end (void)
if (team == NULL)
return;
taskgroup = task->taskgroup;
- if (__builtin_expect (taskgroup == NULL, 0)
+ if (UNLIKELY (taskgroup == NULL)
&& thr->ts.level == 0)
{
/* This can happen if GOMP_taskgroup_start is called when
@@ -2270,7 +2270,7 @@ GOMP_taskgroup_end (void)
{
cancelled
= gomp_task_run_pre (child_task, child_task->parent, team);
- if (__builtin_expect (cancelled, 0))
+ if (UNLIKELY (cancelled))
{
if (to_free)
{
@@ -2306,7 +2306,7 @@ GOMP_taskgroup_end (void)
if (child_task)
{
thr->task = child_task;
- if (__builtin_expect (child_task->fn == NULL, 0))
+ if (UNLIKELY (child_task->fn == NULL))
{
if (gomp_target_task_fn (child_task->fn_data))
{
@@ -2382,7 +2382,7 @@ gomp_reduction_register (uintptr_t *data, uintptr_t *old, uintptr_t *orig,
struct htab *old_htab = NULL, *new_htab;
do
{
- if (__builtin_expect (orig != NULL, 0))
+ if (UNLIKELY (orig != NULL))
{
/* For worksharing task reductions, memory has been allocated
already by some other thread that encountered the construct
@@ -2515,7 +2515,7 @@ GOMP_taskgroup_reduction_register (uintptr_t *data)
struct gomp_team *team = thr->ts.team;
struct gomp_task *task;
unsigned nthreads;
- if (__builtin_expect (team == NULL, 0))
+ if (UNLIKELY (team == NULL))
{
/* The task reduction code needs a team and task, so for
orphaned taskgroups just create the implicit team. */
@@ -2576,7 +2576,7 @@ GOMP_task_reduction_remap (size_t cnt, size_t cntorig, void **ptrs)
for one thread. */
d = (uintptr_t *) p[2];
ptrs[i] = (void *) (d[2] + id * d[1] + p[1]);
- if (__builtin_expect (i < cntorig, 0))
+ if (UNLIKELY (i < cntorig))
ptrs[cnt + i] = (void *) p[0];
continue;
}
@@ -2592,7 +2592,7 @@ GOMP_task_reduction_remap (size_t cnt, size_t cntorig, void **ptrs)
"task modifier for %p", ptrs[i]);
uintptr_t off = ((uintptr_t) ptrs[i] - d[2]) % d[1];
ptrs[i] = (void *) (d[2] + id * d[1] + off);
- if (__builtin_expect (i < cntorig, 0))
+ if (UNLIKELY (i < cntorig))
{
size_t lo = 0, hi = d[0] - 1;
while (lo <= hi)
diff --git a/libgomp/taskloop.c b/libgomp/taskloop.c
index af175f4ac14..39145423133 100644
--- a/libgomp/taskloop.c
+++ b/libgomp/taskloop.c
@@ -180,7 +180,7 @@ GOMP_taskloop (void (*fn) (void *), void *data, void (*cpyfn) (void *, void *),
if (flags & GOMP_TASK_FLAG_NOGROUP)
{
- if (__builtin_expect (gomp_cancel_var, 0)
+ if (UNLIKELY (gomp_cancel_var)
&& thr->task
&& thr->task->taskgroup)
{
@@ -211,7 +211,7 @@ GOMP_taskloop (void (*fn) (void *), void *data, void (*cpyfn) (void *, void *),
|| team->task_count + num_tasks > 64 * team->nthreads)
{
unsigned long i;
- if (__builtin_expect (cpyfn != NULL, 0))
+ if (UNLIKELY (cpyfn != NULL))
{
struct gomp_task task[num_tasks];
struct gomp_task *parent = thr->task;
@@ -332,7 +332,7 @@ GOMP_taskloop (void (*fn) (void *), void *data, void (*cpyfn) (void *, void *),
gomp_mutex_lock (&team->task_lock);
/* If parallel or taskgroup has been cancelled, don't start new
tasks. */
- if (__builtin_expect (gomp_cancel_var, 0)
+ if (UNLIKELY (gomp_cancel_var)
&& cpyfn == NULL)
{
if (gomp_team_barrier_cancelled (&team->barrier))
diff --git a/libgomp/team.c b/libgomp/team.c
index cb6875d70fa..575c6549a0b 100644
--- a/libgomp/team.c
+++ b/libgomp/team.c
@@ -303,7 +303,7 @@ gomp_free_thread (void *arg __attribute__((unused)))
#endif
thr->thread_pool = NULL;
}
- if (thr->ts.level == 0 && __builtin_expect (thr->ts.team != NULL, 0))
+ if (thr->ts.level == 0 && UNLIKELY (thr->ts.team != NULL))
gomp_team_end ();
if (thr->task != NULL)
{
@@ -341,10 +341,10 @@ gomp_team_start (void (*fn) (void *), void *data, unsigned nthreads,
pool = thr->thread_pool;
task = thr->task;
icv = task ? &task->icv : &gomp_global_icv;
- if (__builtin_expect (gomp_places_list != NULL, 0) && thr->place == 0)
+ if (UNLIKELY (gomp_places_list != NULL) && thr->place == 0)
{
gomp_init_affinity ();
- if (__builtin_expect (gomp_display_affinity_var, 0) && nthreads == 1)
+ if (UNLIKELY (gomp_display_affinity_var) && nthreads == 1)
gomp_display_affinity_thread (gomp_thread_self (), &thr->ts,
thr->place);
}
@@ -370,14 +370,14 @@ gomp_team_start (void (*fn) (void *), void *data, unsigned nthreads,
thr->handle = pthread_self ();
#endif
nthreads_var = icv->nthreads_var;
- if (__builtin_expect (gomp_nthreads_var_list != NULL, 0)
+ if (UNLIKELY (gomp_nthreads_var_list != NULL)
&& thr->ts.level < gomp_nthreads_var_list_len)
nthreads_var = gomp_nthreads_var_list[thr->ts.level];
bind_var = icv->bind_var;
if (bind_var != omp_proc_bind_false && (flags & 7) != omp_proc_bind_false)
bind_var = flags & 7;
bind = bind_var;
- if (__builtin_expect (gomp_bind_var_list != NULL, 0)
+ if (UNLIKELY (gomp_bind_var_list != NULL)
&& thr->ts.level < gomp_bind_var_list_len)
bind_var = gomp_bind_var_list[thr->ts.level];
gomp_init_task (thr->task, task, icv);
@@ -390,7 +390,7 @@ gomp_team_start (void (*fn) (void *), void *data, unsigned nthreads,
i = 1;
- if (__builtin_expect (gomp_places_list != NULL, 0))
+ if (UNLIKELY (gomp_places_list != NULL))
{
/* Depending on chosen proc_bind model, set subpartition
for the master thread and initialize helper variables
@@ -508,7 +508,7 @@ gomp_team_start (void (*fn) (void *), void *data, unsigned nthreads,
unsigned int place_partition_off = thr->ts.place_partition_off;
unsigned int place_partition_len = thr->ts.place_partition_len;
unsigned int place = 0;
- if (__builtin_expect (gomp_places_list != NULL, 0))
+ if (UNLIKELY (gomp_places_list != NULL))
{
switch (bind)
{
@@ -667,7 +667,7 @@ gomp_team_start (void (*fn) (void *), void *data, unsigned nthreads,
team->ordered_release[i] = &nthr->release;
}
- if (__builtin_expect (affinity_thr != NULL, 0))
+ if (UNLIKELY (affinity_thr != NULL))
{
/* If AFFINITY_THR is non-NULL just because we had to
permute some threads in the pool, but we've managed
@@ -730,7 +730,7 @@ gomp_team_start (void (*fn) (void *), void *data, unsigned nthreads,
}
- if (__builtin_expect (nthreads + affinity_count > old_threads_used, 0))
+ if (UNLIKELY (nthreads + affinity_count > old_threads_used))
{
long diff = (long) (nthreads + affinity_count) - (long) old_threads_used;
@@ -747,7 +747,7 @@ gomp_team_start (void (*fn) (void *), void *data, unsigned nthreads,
}
attr = &gomp_thread_attr;
- if (__builtin_expect (gomp_places_list != NULL, 0))
+ if (UNLIKELY (gomp_places_list != NULL))
{
size_t stacksize;
pthread_attr_init (&thread_attr);
@@ -767,7 +767,7 @@ gomp_team_start (void (*fn) (void *), void *data, unsigned nthreads,
start_data->ts.place_partition_off = thr->ts.place_partition_off;
start_data->ts.place_partition_len = thr->ts.place_partition_len;
start_data->place = 0;
- if (__builtin_expect (gomp_places_list != NULL, 0))
+ if (UNLIKELY (gomp_places_list != NULL))
{
switch (bind)
{
@@ -862,7 +862,7 @@ gomp_team_start (void (*fn) (void *), void *data, unsigned nthreads,
gomp_fatal ("Thread creation failed: %s", strerror (err));
}
- if (__builtin_expect (attr == &thread_attr, 0))
+ if (UNLIKELY (attr == &thread_attr))
pthread_attr_destroy (&thread_attr);
do_release:
@@ -879,8 +879,8 @@ gomp_team_start (void (*fn) (void *), void *data, unsigned nthreads,
set to NTHREADS + AFFINITY_COUNT. For NTHREADS < OLD_THREADS_COUNT,
AFFINITY_COUNT if non-zero will be always at least
OLD_THREADS_COUNT - NTHREADS. */
- if (__builtin_expect (nthreads < old_threads_used, 0)
- || __builtin_expect (affinity_count, 0))
+ if (UNLIKELY (nthreads < old_threads_used)
+ || UNLIKELY (affinity_count))
{
long diff = (long) nthreads - (long) old_threads_used;
@@ -897,7 +897,7 @@ gomp_team_start (void (*fn) (void *), void *data, unsigned nthreads,
gomp_mutex_unlock (&gomp_managed_threads_lock);
#endif
}
- if (__builtin_expect (gomp_display_affinity_var, 0))
+ if (UNLIKELY (gomp_display_affinity_var))
{
if (nested
|| nthreads != old_threads_used
@@ -933,7 +933,7 @@ gomp_team_start (void (*fn) (void *), void *data, unsigned nthreads,
}
}
}
- if (__builtin_expect (affinity_thr != NULL, 0)
+ if (UNLIKELY (affinity_thr != NULL)
&& team->prev_ts.place_partition_len > 64)
free (affinity_thr);
}
@@ -954,7 +954,7 @@ gomp_team_end (void)
team->barrier in a inconsistent state, we need to use a different
counter here. */
gomp_team_barrier_wait_final (&team->barrier);
- if (__builtin_expect (team->team_cancelled, 0))
+ if (UNLIKELY (team->team_cancelled))
{
struct gomp_work_share *ws = team->work_shares_to_free;
do
@@ -973,7 +973,7 @@ gomp_team_end (void)
gomp_end_task ();
thr->ts = team->prev_ts;
- if (__builtin_expect (thr->ts.level != 0, 0))
+ if (UNLIKELY (thr->ts.level != 0))
{
#ifdef HAVE_SYNC_BUILTINS
__sync_fetch_and_add (&gomp_managed_threads, 1L - team->nthreads);
@@ -987,7 +987,7 @@ gomp_team_end (void)
gomp_barrier_wait (&team->barrier);
}
- if (__builtin_expect (team->work_shares[0].next_alloc != NULL, 0))
+ if (UNLIKELY (team->work_shares[0].next_alloc != NULL))
{
struct gomp_work_share *ws = team->work_shares[0].next_alloc;
do
@@ -1000,8 +1000,8 @@ gomp_team_end (void)
}
gomp_sem_destroy (&team->master_release);
- if (__builtin_expect (thr->ts.team != NULL, 0)
- || __builtin_expect (team->nthreads == 1, 0))
+ if (UNLIKELY (thr->ts.team != NULL)
+ || UNLIKELY (team->nthreads == 1))
free_team (team);
else
{
diff --git a/libgomp/work.c b/libgomp/work.c
index c53625afe2c..7582a861901 100644
--- a/libgomp/work.c
+++ b/libgomp/work.c
@@ -102,13 +102,13 @@ gomp_init_work_share (struct gomp_work_share *ws, size_t ordered,
unsigned nthreads)
{
gomp_mutex_init (&ws->lock);
- if (__builtin_expect (ordered, 0))
+ if (UNLIKELY (ordered))
{
#define INLINE_ORDERED_TEAM_IDS_SIZE \
(sizeof (struct gomp_work_share) \
- offsetof (struct gomp_work_share, inline_ordered_team_ids))
- if (__builtin_expect (ordered != 1, 0))
+ if (UNLIKELY (ordered != 1))
{
size_t o = nthreads * sizeof (*ws->ordered_team_ids);
o += __alignof__ (long long) - 1;
@@ -155,7 +155,7 @@ static inline void
free_work_share (struct gomp_team *team, struct gomp_work_share *ws)
{
gomp_fini_work_share (ws);
- if (__builtin_expect (team == NULL, 0))
+ if (UNLIKELY (team == NULL))
free (ws);
else
{
@@ -244,7 +244,7 @@ gomp_work_share_end (void)
if (gomp_barrier_last_thread (bstate))
{
- if (__builtin_expect (thr->ts.last_work_share != NULL, 1))
+ if (LIKELY (thr->ts.last_work_share != NULL))
{
team->work_shares_to_free = thr->ts.work_share;
free_work_share (team, thr->ts.last_work_share);
@@ -270,7 +270,7 @@ gomp_work_share_end_cancel (void)
if (gomp_barrier_last_thread (bstate))
{
- if (__builtin_expect (thr->ts.last_work_share != NULL, 1))
+ if (LIKELY (thr->ts.last_work_share != NULL))
{
team->work_shares_to_free = thr->ts.work_share;
free_work_share (team, thr->ts.last_work_share);
@@ -300,7 +300,7 @@ gomp_work_share_end_nowait (void)
return;
}
- if (__builtin_expect (thr->ts.last_work_share == NULL, 0))
+ if (UNLIKELY (thr->ts.last_work_share == NULL))
return;
#ifdef HAVE_SYNC_BUILTINS
--
2.36.1
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] libgomp: start using LIKELY/UNLIKELY macros
2022-05-25 11:52 [PATCH] libgomp: start using LIKELY/UNLIKELY macros Martin Liška
@ 2022-05-25 11:55 ` Jakub Jelinek
2022-05-25 13:13 ` Martin Liška
0 siblings, 1 reply; 4+ messages in thread
From: Jakub Jelinek @ 2022-05-25 11:55 UTC (permalink / raw)
To: Martin Liška; +Cc: gcc-patches, Tobias Burnus
On Wed, May 25, 2022 at 01:52:46PM +0200, Martin Liška wrote:
> Similarly to g:22d9c8802add09a93308319fc37dd3a0f1125393, I would like to use
> {UN,}LIKELY macros in libgomp. If the community is fine, I'm planning doing
> the same in other GCC's libraries.
I must say I prefer __builtin_expect over the macros any time.
Jakub
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] libgomp: start using LIKELY/UNLIKELY macros
2022-05-25 11:55 ` Jakub Jelinek
@ 2022-05-25 13:13 ` Martin Liška
2022-05-25 13:19 ` Jakub Jelinek
0 siblings, 1 reply; 4+ messages in thread
From: Martin Liška @ 2022-05-25 13:13 UTC (permalink / raw)
To: Jakub Jelinek; +Cc: gcc-patches, Tobias Burnus
On 5/25/22 13:55, Jakub Jelinek wrote:
> On Wed, May 25, 2022 at 01:52:46PM +0200, Martin Liška wrote:
>> Similarly to g:22d9c8802add09a93308319fc37dd3a0f1125393, I would like to use
>> {UN,}LIKELY macros in libgomp. If the community is fine, I'm planning doing
>> the same in other GCC's libraries.
>
> I must say I prefer __builtin_expect over the macros any time.
>
> Jakub
>
I respect that.
Btw. I noticed one discrepancy:
./libgomp/loop_ull.c:
/* Cheap overflow protection. */
if (__builtin_expect ((nthreads | ws->chunk_size_ull)
< 1ULL << (sizeof (gomp_ull)
* __CHAR_BIT__ / 2 - 1), 1))
ws->mode = ws->end_ull < (__LONG_LONG_MAX__ * 2ULL + 1
- (nthreads + 1) * ws->chunk_size_ull);
while:
./libgomp/loop.c:
/* Cheap overflow protection. */
if (__builtin_expect ((nthreads | ws->chunk_size)
>= 1UL << (sizeof (long)
* __CHAR_BIT__ / 2 - 1), 0))
ws->mode = 0;
So once, it uses __builtin_expect(..., 1) and second time __builtin_expect(..., 0).
Is it expected?
Thanks,
Martin
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] libgomp: start using LIKELY/UNLIKELY macros
2022-05-25 13:13 ` Martin Liška
@ 2022-05-25 13:19 ` Jakub Jelinek
0 siblings, 0 replies; 4+ messages in thread
From: Jakub Jelinek @ 2022-05-25 13:19 UTC (permalink / raw)
To: Martin Liška; +Cc: gcc-patches, Tobias Burnus
On Wed, May 25, 2022 at 03:13:09PM +0200, Martin Liška wrote:
> Btw. I noticed one discrepancy:
>
> ./libgomp/loop_ull.c:
>
> /* Cheap overflow protection. */
> if (__builtin_expect ((nthreads | ws->chunk_size_ull)
> < 1ULL << (sizeof (gomp_ull)
> * __CHAR_BIT__ / 2 - 1), 1))
> ws->mode = ws->end_ull < (__LONG_LONG_MAX__ * 2ULL + 1
> - (nthreads + 1) * ws->chunk_size_ull);
>
> while:
>
> ./libgomp/loop.c:
>
> /* Cheap overflow protection. */
> if (__builtin_expect ((nthreads | ws->chunk_size)
> >= 1UL << (sizeof (long)
> * __CHAR_BIT__ / 2 - 1), 0))
> ws->mode = 0;
>
> So once, it uses __builtin_expect(..., 1) and second time __builtin_expect(..., 0).
> Is it expected?
Yes. The comparison is different. The first case is
or_of_the_two_values < 0x80000000ULL which is predicted likely (usually both
number of threads and chunk size are small numbers).
While in the other case it is
or_of_the_two_values >= 0x80000000UL (or 0x8000UL for 32-bit arches)
and again, we predict both numbers to be small and so the comparison to be
false.
Jakub
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2022-05-25 13:19 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-25 11:52 [PATCH] libgomp: start using LIKELY/UNLIKELY macros Martin Liška
2022-05-25 11:55 ` Jakub Jelinek
2022-05-25 13:13 ` Martin Liška
2022-05-25 13:19 ` Jakub Jelinek
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).