the code

int test_bit(unsigned long *words, int bit)
{
    int wsize = (sizeof *words) * 8;
    return (words[bit / wsize] & (1 << (bit % wsize))) != 0;
}

can compile to

    xor %rax, %rax
    bt  %rsi, (%rdi)
    setc %al

but instead compiles to a much longer sequence, using many more registers,
which is probably slower as well. If gcc recognized this common idiom (like it
recognizes bit rotate sequences), smaller and more optimal code would be
generated (especially if the result of the test is in an if statement - it
could boil down to a bt; jc sequence).


-- 
           Summary: test_bit() compilation does not expand to "bt"
                    instruction
           Product: gcc
           Version: 4.0.2
            Status: UNCONFIRMED
          Severity: minor
          Priority: P3
         Component: target
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: avi at argo dot co dot il
 GCC build triplet: x86_64-redhat-linux
  GCC host triplet: x86_64-redhat-linux
GCC target triplet: x86_64-redhat-linux


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


Reply via email to