• Linus Torvalds's avatar
    give up on gcc ilog2() constant optimizations · 2143e71a
    Linus Torvalds authored
    commit 474c9015 upstream.
    
    gcc-7 has an "optimization" pass that completely screws up, and
    generates the code expansion for the (impossible) case of calling
    ilog2() with a zero constant, even when the code gcc compiles does not
    actually have a zero constant.
    
    And we try to generate a compile-time error for anybody doing ilog2() on
    a constant where that doesn't make sense (be it zero or negative).  So
    now gcc7 will fail the build due to our sanity checking, because it
    created that constant-zero case that didn't actually exist in the source
    code.
    
    There's a whole long discussion on the kernel mailing about how to work
    around this gcc bug.  The gcc people themselevs have discussed their
    "feature" in
    
       https://gcc.gnu.org/bugzilla/show_bug.cgi?id=72785
    
    but it's all water under the bridge, because while it looked at one
    point like it would be solved by the time gcc7 was released, that was
    not to be.
    
    So now we have to deal with this compiler braindamage.
    
    And the only simple approach seems to be to just delete the code that
    tries to warn about bad uses of ilog2().
    
    So now "ilog2()" will just return 0 not just for the value 1, but for
    any non-positive value too.
    
    It's not like I can recall anybody having ever actually tried to use
    this function on any invalid value, but maybe the sanity check just
    meant that such code never made it out in public.
    Reported-by: default avatarLaura Abbott <labbott@redhat.com>
    Cc: John Stultz <john.stultz@linaro.org>,
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    2143e71a
log2.h 5.04 KB