gcc changes the logical order of the code. I have a 16 byte structure on which I use a macro version of bzero() that looks like this:
#define lipc_bzero( __buf, __size ) \ { \ size_t __i = ( ( __size ) >> ( sizeof( long ) >> 1 ) ); \ while ( ( __i-- ) > 0 ) { \ ( ( long * )__buf )[__i] = ( long )0; \ } \ } and I use it like this: /* > code */ struct header_t a; my_bzero( &a, sizeof( a ) ); a.id = 0x4350494c; a.rid = handle->rid; /* a 32bit random number */ a.st_size = sizeof( a ); a.size = 1024; lipc_send( s, &a, sizeof( a ), MSG_NOSIGNAL, -1 ); /* < code */ if I compile the code with: "-c -ansi -g -std=gnu99 -fPIC -DPIC -D_REENTRANT -Os -ffast-math" the asm code is: ;; [snip]------------------------------------------- .loc 1 469 0 leal -28(%ebp), %ecx movl $0, -4(%ecx,%eax,4) decl %eax jne .L46 .LBE9: .loc 1 470 0 movl $1129335116, -28(%ebp) .loc 1 477 0 subl $12, %esp .loc 1 471 0 movl 8(%esi), %eax .loc 1 472 0 movl $16, -20(%ebp) .loc 1 473 0 movl %edi, -16(%ebp) .loc 1 471 0 movl %eax, -24(%ebp) .loc 1 477 0 leal 24(%ebp), %eax movl 44(%esi), %edx pushl %eax movl $16, %eax pushl $16384 subl %edx, %eax pushl %eax leal (%ecx,%edx), %edx pushl %edx pushl (%esi) .LCFI23: call [EMAIL PROTECTED] ;; [snip] --------------------------------- and works as a charm, but if add "-funroll-loops" (to unroll the lipc_bzero()), the asm is: ;; [snip]---------------------------- .LBB10: .loc 1 470 0 movl $1129335116, -28(%ebp) .loc 1 477 0 subl $12, %esp .loc 1 471 0 movl 8(%esi), %ecx .loc 1 477 0 leal 24(%ebp), %eax .LVL26: pushl %eax pushl $16384 leal -28(%ebp,%edx), %eax .loc 1 471 0 movl %ecx, -24(%ebp) .loc 1 477 0 movl $16, %ecx subl %edx, %ecx pushl %ecx pushl %eax .loc 1 472 0 movl $16, -20(%ebp) .loc 1 473 0 movl %edi, -16(%ebp) .loc 1 477 0 pushl (%esi) .LBB11: .loc 1 469 0 movl $0, -16(%ebp) movl $0, -20(%ebp) movl $0, -24(%ebp) movl $0, -28(%ebp) .LBE11: .loc 1 477 0 .LCFI23: call [EMAIL PROTECTED] ;; [snip]---------------------------------------- In other words, the code became: struct header_t a; a.id = 0x4350494c; a.rid = handle->rid; /* a 32bit random number */ a.st_size = sizeof( a ); a.size = 1024; my_bzero( &a, sizeof( a ) ); lipc_send( s, &a, sizeof( a ), MSG_NOSIGNAL, -1 ); I did not read every bug in the database, but I think this is new (or not :)). I'm sorry I can't give you the whole code, but I will try to help in any other way. Regards, Mihai -- Summary: gcc changes code order Product: gcc Version: 4.1.1 Status: UNCONFIRMED Severity: major Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: mihai dot dontu at gmail dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30855