On Wed, Apr 3, 2024, at 17:45, Jason Gunthorpe wrote: > On Thu, Mar 28, 2024 at 03:30:45PM +0100, Arnd Bergmann wrote: >> From: Arnd Bergmann <arnd@xxxxxxxx> >> >> clang warns for comparisons that are always true, which is the case >> for these two page size checks on architectures with 64KB pages: >> >> drivers/infiniband/core/uverbs_ioctl.c:90:39: error: result of comparison of constant 65536 with expression of type 'u16' (aka 'unsigned short') is always false [-Werror,-Wtautological-constant-out-of-range-compare] >> WARN_ON_ONCE(method_elm->bundle_size > PAGE_SIZE); >> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~ >> include/asm-generic/bug.h:104:25: note: expanded from macro 'WARN_ON_ONCE' >> int __ret_warn_on = !!(condition); \ >> ^~~~~~~~~ >> drivers/infiniband/core/uverbs_ioctl.c:621:17: error: result of comparison of constant 65536 with expression of type '__u16' (aka 'unsigned short') is always false [-Werror,-Wtautological-constant-out-of-range-compare] >> if (hdr.length > PAGE_SIZE || >> ~~~~~~~~~~ ^ ~~~~~~~~~ >> >> Add a cast to u32 in both cases, so it never warns about this. > > But doesn't that hurt the codegen? I just double-checked in the compiler explorer to confirm that this works as I expected: both gcc and clang are still able to optimize out the comparison for 64K pages, but clang no longer complains after my change that this is an obvious case. I also see that gcc still produces a -Wtype-limits warning, but that likely has to stay disabled because it produces too much output elsewhere and I don't see an easy way to shut it up. Arnd