Quoting Bernd Schmidt <ber...@codesourcery.com>:
* Most sane ABIs pass single-word structs in registers
Unfortunately, the i386 SYSV ABI (used generally for i386 elf toolchains) is half-way insane in that respect: function return of small aggregates also goes via a caller-passed pointer to a stack slot. (You can avoid that using -freg-struct-return, but that option is not safe unless you have a full set of multilibs built with that option.)
* For the most part, gcc runs on i686 and there it doesn't make a difference.
It used to make a difference for function value return. But apparently we have lost that feature of transparent union somewhere between gcc 2.7.0 and gcc 4.4.5 .