Re: [PATCH v2] printf: Compile the kunit test with DISABLE_BRANCH_PROFILING

From: Tamir Duberstein

Date: Wed Apr 08 2026 - 08:46:00 EST


On Wed, Apr 8, 2026 at 8:28 AM Petr Mladek <pmladek@xxxxxxxx> wrote:
>
> Old GCC can miscompile printf_kunit's errptr() test when branch
> profiling is enabled. BUILD_BUG_ON(IS_ERR(PTR)) is a constant false
> expression, but CONFIG_TRACE_BRANCH_PROFILING and
> CONFIG_PROFILE_ALL_BRANCHES make the IS_ERR() path side-effectful.
> GCC's IPA splitter can then outline the cold assert arm into
> errptr.part.* and leave that clone with an unconditional
> __compiletime_assert_*() call, causing a false build failure.
>
> This started showing up after test_hashed() became a macro and moved its
> local buffer into errptr(), which changed GCC's inlining and splitting
> decisions enough to expose the compiler bug.
>
> Workaround the problem by disabling the branch profiling for
> printf_kunit.o. It is a straightforward and acceptable solution.
>
> Fixes: 9bfa52dac27a ("printf: convert test_hashed into macro")
> Reported-by: kernel test robot <lkp@xxxxxxxxx>
> Closes: https://lore.kernel.org/oe-kbuild-all/202604030636.NqjaJvYp-lkp@xxxxxxxxx/
> Cc: stable@xxxxxxxxxxxxxxx
> Signed-off-by: Petr Mladek <pmladek@xxxxxxxx>
> ---
> Changes against v1:
>
> + Disable the branch profiling for the whole printf_kunit.o
> instead of using "noinline".
>
> lib/tests/Makefile | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/lib/tests/Makefile b/lib/tests/Makefile
> index 05f74edbc62b..fbb2aad26994 100644
> --- a/lib/tests/Makefile
> +++ b/lib/tests/Makefile
> @@ -40,6 +40,7 @@ obj-$(CONFIG_MEMCPY_KUNIT_TEST) += memcpy_kunit.o
> obj-$(CONFIG_MIN_HEAP_KUNIT_TEST) += min_heap_kunit.o
> CFLAGS_overflow_kunit.o = $(call cc-disable-warning, tautological-constant-out-of-range-compare)
> obj-$(CONFIG_OVERFLOW_KUNIT_TEST) += overflow_kunit.o
> +CFLAGS_printf_kunit.o += -DDISABLE_BRANCH_PROFILING
> obj-$(CONFIG_PRINTF_KUNIT_TEST) += printf_kunit.o
> obj-$(CONFIG_RANDSTRUCT_KUNIT_TEST) += randstruct_kunit.o
> obj-$(CONFIG_SCANF_KUNIT_TEST) += scanf_kunit.o
> --
> 2.53.0
>

It would be good to add a comment explaining when this workaround can
be removed.