[llvm] r197272 - [block-freq] Add the method APInt::nearestLogBase2().

Michael Gottesman mgottesman at apple.com
Thu Dec 26 22:21:52 PST 2013


I chatted with Duncan and after a bit of discussion, we agreed that to have log2(1) be 0 with a comment specifying that we are defining log2 in a 1 bit space is defined as:

log2(0) == INF_MAX
log2(1) == 0

without any reference to 2 (i.e. we are just going to define it as such). Preparing a patch.

On Dec 16, 2013, at 7:36 AM, Stephen Canon <scanon at apple.com> wrote:

> On Dec 16, 2013, at 1:39 AM, Duncan P. N. Exon Smith <dexonsmith at apple.com> wrote:
> 
>> On 2013 Dec 15, at 20:41, Michael Gottesman <mgottesman at apple.com> wrote:
>> 
>>> On Dec 15, 2013, at 2:44 PM, Duncan P. N. Exon Smith <dexonsmith at apple.com> wrote:
>>> 
>>>> I thought of another degenerate case, and unfortunately I think the
>>>> current code gets the wrong answer:
>>>> 
>>>> - APInt(1, 1).nearestLogBase2() == 0 // lg(1) should give 0, not 1.
>>> 
>>> This is incorrect since log2 is not a well defined operation in Z/Z_1. If one defines log2(x) as the largest N such that 2^N < x then since in Z/Z_1, 2^N = 0^N, N could be any number. In reality we should probably add in an assertion to make sure that the routines are only called if the BitWidth is > 1.
>> 
>> I’m not convinced that lg(1) is undefined; whether 2 itself is
>> representable is irrelevant.  Even if I’m wrong, the following
>> would be surprising:
>> 
>>   x.logBase2()        => 0
>>   x.ceilLogBase2()    => 0
>>   x.nearestLogBase2() => 1 ???
>> 
>> AFAICT, countLeadingZeros() hits at least two branches before
>> calling __builtin_clz, so the micro-optimization won't give
>> much benefit in practice anyway.
> 
> I’m inclined to agree with Duncan here.  If you really want to get all mathematical about it, we can define exp2 as the unique exponential map on monoids from (Z/Z_N,+) to (Z/Z_2^N,•) that maps 1 —> 2 if it exists, and treat N=1 as a degenerate corner case since there is no 1 in Z/Z_1.  Then let log2 be a step-function extension of the inverse, and call it a day.
> 
> Alternatively (or TL;DR mathematical gobbledygook): It is more useful to have log2(1) = 0 regardless of how many bits are used to represent 1.
> 
> – Steve





More information about the llvm-commits mailing list