Sent from my iPhone

On Dec 30, 2009, at 7:56 AM, "debian-gcc at lists dot debian dot org" <gcc-bugzi...@gcc.gnu.org > wrote:

current trunk/branches on x86_64-linux-gnu. return values with different
compilers and different optimizations:

        -O0  -O1  -O2  -O3
gcc-4.1   0    2    2    2
gcc-4.3   0    2    2    2
gcc-4.4   2    0    0    0
gcc-4.5   0    1    0    0

 Matthias

#include <stdbool.h>
#include <stdio.h>

static bool atomic_test_and_reset_bit(unsigned long *v,unsigned long bit) {
 bool res;

 __asm__ __volatile__( "btr %2,%1\n"
                       "adc $0,%0\n"
                       :"=r"(res), "=m"(*v)
                       :"r"(bit), "r"(0)) ;
 return res ? 1 : 0;

This inline-asm looks wrong. Because it says *v is always overriden. So if that function is inlined, flags down below does not have to be set before it.

}

int main(void)
{
 unsigned long flags = 0;
 int j;

 j = atomic_test_and_reset_bit(&flags, 2);

 printf("%d\n", j);

 return 0;
}


--
          Summary: wrong code with -O1
          Product: gcc
          Version: 4.4.3
           Status: UNCONFIRMED
         Severity: normal
         Priority: P3
        Component: target
       AssignedTo: unassigned at gcc dot gnu dot org
       ReportedBy: debian-gcc at lists dot debian dot org
GCC target triplet: x86_64-linux-gnu


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

Reply via email to