[PATCH] x86: Don't left shift negative values
Andrew Pinski
pinskia@gmail.com
Thu Mar 12 05:51:37 GMT 2026
On Wed, Mar 11, 2026 at 10:34 PM Collin Funk <collin.funk1@gmail.com> wrote:
>
> GCC warns about this with -Wshift-negative-value:
>
> In file included from ../sysdeps/x86/cpu-features.c:24:
> ../sysdeps/x86/dl-cacheinfo.h: In function ‘get_common_cache_info’:
> ../sysdeps/x86/dl-cacheinfo.h:913:45: warning: left shift of negative value [-Wshift-negative-value]
> 913 | count_mask = ~(-1 << (count_mask + 1));
> | ^~
> ../sysdeps/x86/dl-cacheinfo.h:930:45: warning: left shift of negative value [-Wshift-negative-value]
> 930 | count_mask = ~(-1 << (count_mask + 1));
> | ^~
>
> This is because C23 § 6.5.8 specifies that this is undefined behavior.
> We can cast it to unsigned which would be equivelent to UINT_MAX.
> ---
> sysdeps/x86/dl-cacheinfo.h | 6 ++++--
> 1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/sysdeps/x86/dl-cacheinfo.h b/sysdeps/x86/dl-cacheinfo.h
> index fd2e60fa38..b1540e2bc1 100644
> --- a/sysdeps/x86/dl-cacheinfo.h
> +++ b/sysdeps/x86/dl-cacheinfo.h
> @@ -910,7 +910,8 @@ get_common_cache_info (long int *shared_ptr, long int * shared_per_thread_ptr, u
> /* Compute count mask. */
> asm ("bsr %1, %0"
> : "=r" (count_mask) : "g" (threads_l2));
> - count_mask = ~(-1 << (count_mask + 1));
> + count_mask
> + = ~((unsigned int) -1 << (count_mask + 1));
Why not just:
count_mask = ~(-1u << (count_mask + 1));
> threads_l2 = (shipped - 1) & count_mask;
> count &= ~0x1;
> }
> @@ -927,7 +928,8 @@ get_common_cache_info (long int *shared_ptr, long int * shared_per_thread_ptr, u
> /* Compute count mask. */
> asm ("bsr %1, %0"
> : "=r" (count_mask) : "g" (threads_core));
> - count_mask = ~(-1 << (count_mask + 1));
> + count_mask
> + = ~((unsigned int) -1 << (count_mask + 1));
Likewise?
Thanks,
Andrew
> threads_core = (shipped - 1) & count_mask;
> if (level == 2)
> threads_l2 = threads_core;
> --
> 2.53.0
>
More information about the Libc-alpha
mailing list