/* 2006-05-21: vex r1619 finally causes the x86->IR front end to state exactly the %eflags dataflow surrounding 'cmpb $0, ... ; js ..' and so memcheck no longer gives a false positive on this test. ----------- (original comments) Assembly derived from the following program compiled with -O2. This fools Valgrind, causing it to give a false error. #include <stdio.h> struct Foo { int a1 : 1; int a2 : 1; int a3 : 1; int a4 : 1; int a5 : 1; int a6 : 1; int a7 : 1; int bleh : 1; }; struct Foo* foo; void set() { foo->bleh = 1; } void get() { if ( foo->bleh == 0 ) printf( "blieb\n" ); } int main() { foo = malloc(sizeof(struct Foo)); set(); get(); return 0; } */ #include "tests/asm.h" .file "tronical.c" #if defined(VGO_linux) || defined(VGO_solaris) .version "01.01" #endif gcc2_compiled.: .text .align 4 .globl set set: pushl %ebp movl foo, %eax orb $128, (%eax) movl %esp, %ebp popl %ebp ret .Lfe1: .LC0: .ascii "blieb\n" .text .align 4 .globl get get: pushl %ebp movl %esp, %ebp subl $8, %esp movl foo, %eax cmpb $0, (%eax) js .L4 subl $12, %esp pushl $.LC0 call VG_SYM_ASM(printf) addl $16, %esp .L4: leave ret .Lfe2: .align 4 .globl VG_SYM_ASM(main) VG_SYM_ASM(main): pushl %ebp movl %esp, %ebp subl $20, %esp pushl $4 call VG_SYM_ASM(malloc) movl %eax, foo call set call get xorl %eax, %eax leave ret .Lfe3: .comm foo,4,4 .ident "GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)"