compiling the following program with -O2 for i386 yields the latter asm output. % gcc -v Using built-in specs. Configured with: /usr/src/tools/gcc/../../gnu/dist/gcc/configure --enable-long-long --disable-multilib --enable-threads --build=i386-unknown-netbsdelf --host=i386--netbsdelf --target=i386--netbsdelf : (reconfigured) /usr/src/tools/gcc/../../gnu/dist/gcc/configure --enable-long-long --disable-multilib --enable-threads --build=i386-unknown-netbsdelf1.6W --host=i386--netbsdelf --target=i386--netbsdelf Thread model: posix gcc version 3.3.1 ============================================================ #include <stdio.h> int main() { union { int i; short s; } u[] = {{1}, {2}, {3}}; printf("%d\n", *&u->s); } ============================================================ .file "a.c" .section .rodata.str1.1,"aMS",@progbits,1 .LC0: .string "%d\n" .text .p2align 2,,3 .globl main .type main, @function main: pushl %ebp movl %esp, %ebp subl $24, %esp andl $-16, %esp subl $8, %esp movswl -24(%ebp),%eax # <= used before initialized. pushl %eax pushl $.LC0 movl $1, -24(%ebp) # <= initialize here movl $2, -20(%ebp) movl $3, -16(%ebp) call printf leave ret .size main, .-main .ident "GCC: (GNU) 3.3.1"
I can confirm this on the mainline (20030925), the problem is aliasing issue.
Fixed on the mainline (20031224).