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



             Bug #: 56767

           Summary: gcc does not generate correct code with -O2

    Classification: Unclassified

           Product: gcc

           Version: 4.7.2

            Status: UNCONFIRMED

          Severity: normal

          Priority: P3

         Component: c

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: jupitercu...@gmail.com





== How to repeat (on a 32-bit Linux machine) ==



With following code:



// begin of code

#include <stdio.h>



int round2(int n) {

    int ret;

    if (n == 0) { return 0; }

    __asm__ __volatile__ ("bsr %0, %1\n\t"

                          :"=r"(ret): "r"(n));

    ret = 1 << ret;

}



int main() {

    int a;

    scanf("%d", &a);

    printf("%d\n", round2(a));

    return 0;

}

// end of code



With -O0, we get correct result, but with -O2, the generated assembly is:

main:

.LFB12:

    .cfi_startproc

    pushl   %ebp

    .cfi_def_cfa_offset 8

    .cfi_offset 5, -8

    movl    %esp, %ebp

    .cfi_def_cfa_register 5

    andl    $-16, %esp

    subl    $32, %esp

    leal    28(%esp), %eax

    movl    %eax, 4(%esp)

    movl    $.LC0, (%esp)

    call    __isoc99_scanf

    movl    28(%esp), %eax

    testl   %eax, %eax

    je  .L6

#APP

# 6 "bit.c" 1

    bsr %eax, %eax



# 0 "" 2

#NO_APP

.L6:

    movl    $0, 4(%esp) // ALWAYS output 0

    movl    $.LC1, (%esp)

    call    printf

    xorl    %eax, %eax

    leave

Reply via email to