[llvm-commits] [llvm] r107199 - /llvm/trunk/include/llvm/ADT/SmallPtrSet.h
Duncan Sands
baldrick at free.fr
Wed Jun 30 07:49:12 PDT 2010
Hi Jakob,
>> NextPowerOfTwo was already used to ensure that SmallSizePowTwo is a power
>> of two, no need to do it a second time (NextPowerOfTwo is idempotent).
>
> No it isn't.
>
> Ignoring overflow, NextPowerOfTwo(x) is always strictly greater than x.
are you sure? C++ templates make my head hurt, but as far as I can see it
works as follows. Suppose N is a power of two, then the definition
template<unsigned N>
struct NextPowerOfTwo {
enum { Val = NextPowerOfTwoH<N, (N&(N-1)) == 0>::Val };
};
gives [since the condition (N&(N-1)) == 0 evaluates to true]
struct NextPowerOfTwo {
enum { Val = NextPowerOfTwoH<N, true>::Val };
};
Since NextPowerOfTwoH<N, true> is defined by
template<unsigned N, bool isPowerTwo>
struct NextPowerOfTwoH {
enum { Val = N };
};
it looks to me like you get Val set to N, and thus the result is N.
Ciao,
Duncan.
More information about the llvm-commits
mailing list