]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
x86: Don't left shift negative values
authorCollin Funk <collin.funk1@gmail.com>
Thu, 12 Mar 2026 04:57:20 +0000 (21:57 -0700)
committerCollin Funk <collin.funk1@gmail.com>
Fri, 13 Mar 2026 02:00:18 +0000 (19:00 -0700)
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.

Reviewed-by: H.J. Lu <hjl.tools@gmail.com>
sysdeps/x86/dl-cacheinfo.h

index fd2e60fa38d483af14ed0212da5d549f160e3dc7..b6e17b0e32103f65c0f701e65d89c02414125b87 100644 (file)
@@ -910,7 +910,7 @@ 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 = ~(-1U << (count_mask + 1));
                           threads_l2 = (shipped - 1) & count_mask;
                           count &= ~0x1;
                         }
@@ -927,7 +927,7 @@ 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 = ~(-1U << (count_mask + 1));
                           threads_core = (shipped - 1) & count_mask;
                           if (level == 2)
                             threads_l2 = threads_core;