The following function:

static struct { int w; } s;

void wait (void) {
 int t;
loop:
 t = *((volatile int *) &s.w);
 if (t > 0) goto loop;
}

is compiled incorrectly with "gcc -v -O3 v.c -o v.s -Wall -S". The generated
assembly does not respetc the semantics of volatile:

wait:
        movl    s, %eax
        pushl   %ebp
        movl    %esp, %ebp
        testl   %eax, %eax
        jg      .L6
        popl    %ebp
        ret
.L3:
.L6:
        jmp     .L6

The attached testscase shows the problem. It also includes a similar function
which does get compiled correctly, the only difference is that it introduces a
temporary variable. 

Detailed compiled output:

/home/ricardo/mine/install/bin/gcc -v -O3 v.c -o v.s -Wall -S
Using built-in specs.
Target: i686-pc-linux-gnu
Configured with: ../configure --prefix=/home/ricardo/mine/install/
--enable-ckecking=all --enable-languages=c,cil --disable-bootstrap :
(reconfigured) ../configure --prefix=/home/ricardo/mine/install/
--enable-languages=c,cil --disable-bootstrap
Thread model: posix
gcc version 4.2.0 20060826 (experimental)
 /home/ricardo/mine/install/bin/../libexec/gcc/i686-pc-linux-gnu/4.2.0/cc1
-quiet -v -iprefix
/home/ricardo/mine/install/bin/../lib/gcc/i686-pc-linux-gnu/4.2.0/ v.c -quiet
-dumpbase v.c -mtune=generic -auxbase-strip v.s -O3 -Wall -version -o v.s
ignoring nonexistent directory
"/home/ricardo/mine/install/bin/../lib/gcc/i686-pc-linux-gnu/4.2.0/../../../../i686-pc-linux-gnu/include"
ignoring duplicate directory
"/home/ricardo/mine/install//lib/gcc/i686-pc-linux-gnu/4.2.0/include"
ignoring nonexistent directory
"/home/ricardo/mine/install//lib/gcc/i686-pc-linux-gnu/4.2.0/../../../../i686-pc-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /home/ricardo/mine/install/bin/../lib/gcc/i686-pc-linux-gnu/4.2.0/include
 /usr/local/include
 /home/ricardo/mine/install//include
 /usr/include
End of search list.
GNU C version 4.2.0 20060826 (experimental) (i686-pc-linux-gnu)
        compiled by GNU C version 4.1.2 20061020 (prerelease) (Debian
4.1.1-17).
GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096
Compiler executable checksum: 39ae1c561861def994882f2081f65beb


-- 
           Summary: Volatile semantics ignored in some cases
           Product: gcc
           Version: 4.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: ricardo dot fernandez at st dot com
 GCC build triplet: i686-pc-linux-gnu
  GCC host triplet: i686-pc-linux-gnu
GCC target triplet: i686-pc-linux-gnu


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

Reply via email to