On Mon, May 13, 2013 at 6:29 PM, Richard Henderson <rth@twiddle.net> wrote:
On 05/13/2013 08:36 AM, Peter Collingbourne wrote:
This function is not const, as it can modify log2_m and log2_m_inited.
So? The const attribute gets gcc to treat it as const, which means
that the call of get_log2 can be deleted if unused, or the call moved
outside of a loop. IMO this would be a bug in LLVM if it errors for this.
Those aren't necessarily the only optimisations that can be performed on a
const function call. The issue in this particular case is that LLVM's
optimiser will
replace the call to the function with a reference to its return value, log2_m
(thereby skipping its initialisation). Given that the source code is
lying to the
compiler about the constness of the function, this isn't entirely unreasonable.
While one could in theory detect such cases in LLVM, I consider it to be a bug
in glibc that it is lying to the compiler.