https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116616

            Bug ID: 116616
           Summary: Linux kernel fails to build on aarch64 due to
                    r15-3256-g1c4b9826bd0d5a
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: pheeck at gcc dot gnu.org
          Reporter: pheeck at gcc dot gnu.org
                CC: jamborm at gcc dot gnu.org, mkuvyrkov at gcc dot gnu.org
  Target Milestone: ---
              Host: x86_64-linux
            Target: aarch64-gnu-linux

Linux stable kernel (commit 88fac17500f4ea49c7bac136cf1b27e7b9980075) currently
fails linking when built with trunk GCC aarch64 crosscompiler.

linux/drivers/regulator/core.c:4637:(.text+0x5cd0): undefined reference to
`__popcountdi2'

This is probably because the exponential index transform in the switch
conversion pass inserts a call to __builtin_popcount which eventually becomes a
call to the __popcountdi2 libgcc function.

Exp index transform counts on the widening_mul pass to notice this pattern

tmp1 = __builtin_popcount (var)
tmp2 = tmp1 == 1

and either convert the builtin into an internal function call or convert the
whole pattern into (var ^ (var - 1)) > (var - 1). In case of
drivers/regulator/core.c, this doesn't happen. Other optimizations move the
tmp1 == 1 statement farther from the __builtin_popcount call before
widening_mul is run.

I'm currently working on a fix in which I modify exponential index transform to
generate (var ^ (var - 1)) > (var - 1) instead of __builtin_popcount (var) ==
1.

Reply via email to