Какой-то он странный стал, дурит.
Есть простой кусок кода, знаю так немного криво делать, но ничего плохого в этом нет, правда ведь? )))
#include <stddef.h>
#pragma pack(1)
typedef struct _footype {
  char          bar1[8];
  void*         bar2;
} footype;
footype *foo() {
  footype *dummy;
  dummy=(footype*)findbar();
  *((unsigned long*)&dummy)-=offsetof(footype,bar2);
  return dummy;
}
$ gcc -c -S -O1 gcc.c получаю такой листинг
	.file	"gcc.c"
	.text
.globl foo
	.type	foo, @function
foo:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$24, %esp
	call	findbar
	subl	$8, %eax   <== получаем указатель на footype
	leave
	ret
	.size	foo, .-foo
	.ident	"GCC: (GNU) 4.4.0 20090526 (prerelease)"
	.section	.note.GNU-stack,"",@progbits
с оптимизацией O2
$ gcc -c -S -O2 gcc.c
	.file	"gcc.c"
	.text
	.p2align 4,,15
.globl foo
	.type	foo, @function
foo:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$24, %esp
	call	findbar
                          <===== где sub $8, б&я?
	leave
	ret
	.size	foo, .-foo
	.ident	"GCC: (GNU) 4.4.0 20090526 (prerelease)"
	.section	.note.GNU-stack,"",@progbits
Тот же код на 4.3.2 дает хоть и кривее листинг, но он корректен.
-O1
	.file	"gcc.c"
	.text
.globl foo
	.type	foo, @function
foo:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$24, %esp
	call	findbar
	movl	%eax, -4(%ebp)
	subl	$8, -4(%ebp)
	movl	-4(%ebp), %eax
	leave
	ret
	.size	foo, .-foo
	.ident	"GCC: (GNU) 4.3.2"
	.section	.note.GNU-stack,"",@progbits
-O2
	.file	"gcc.c"
	.text
.globl foo
	.type	foo, @function
foo:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$24, %esp
	call	findbar
	movl	%eax, -4(%ebp)
	subl	$8, -4(%ebp)
	leave
	ret
	.size	foo, .-foo
	.ident	"GCC: (GNU) 4.3.2"
	.section	.note.GNU-stack,"",@progbits
т.е. прямо по стеку фигачит и возвращает значение.
Естественно в этом месте я код поправил, но хотелось бы знать почему гцц приподнес мне такую жопу? И что от него еще ждать. Одну ошибку я так и не могу найти ((( при использовании 4.3.2 все ОК.

