[Bug c/43406] New: __builtin_popcountll fails with -O0 and -mpopcnt

rbarreira at gmail dot com gcc-bugzilla@gcc.gnu.org
Wed Mar 17 16:05:00 GMT 2010


Sample code:

#include <stdio.h>

int main (void)
{
    long long a = 0xFFFFFFFFFFFFLL; // 48 bits set
    int popcount;

#if 1
    popcount = __builtin_popcountll (a);
#else
    popcount = __popcountdi2 (a);
#endif

    printf ("%llx popcount = %d\n", a, popcount);
    return 0;
}

If -mpopcnt is enabled, this code only outputs the correct value (48) when -O3
is on (apparently it's calculating it at compile time). Without optimizations,
it is apparently only counting the bits in the lower dword of the long long
variable.

OTOH, If __popcountdi2 is used, it works correctly (but according to the
assembly code it's not really using the popcnt instruction which means it's
much slower).


Test runs and output follow (note you need a CPU which supports the popcnt
instruction):

=> gcc popcnt.c -o popcnt -Wall -O0 -mpopcnt && ./popcnt
ffffffffffff popcount = 32
=> gcc popcnt.c -o popcnt -Wall -O3 -mpopcnt && ./popcnt
ffffffffffff popcount = 48
=> gcc popcnt.c -o popcnt -Wall -O0 && ./popcnt
ffffffffffff popcount = 48
=> gcc popcnt.c -o popcnt -Wall -O3 && ./popcnt
ffffffffffff popcount = 48


-- 
           Summary: __builtin_popcountll fails with -O0 and -mpopcnt
           Product: gcc
           Version: 4.1.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: rbarreira at gmail dot com
 GCC build triplet: i586-suse-linux
  GCC host triplet: i586-suse-linux
GCC target triplet: i586-suse-linux


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43406



More information about the Gcc-bugs mailing list