This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c/22141] New: Missing optimization when storing structures
- From: "fm3 at os dot inf dot tu-dresden dot de" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 22 Jun 2005 10:51:54 -0000
- Subject: [Bug c/22141] New: Missing optimization when storing structures
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
In the attached example, the store of type_t is not optimized by gcc. Instead
of storing one 32-bit value, four 8-bit values are stored.
gcc-4.0.1 produces the following code:
/home/fm3/foo.c:16
80483b7: c6 05 13 96 04 08 04 movb $0x4,0x8049613
80483be: c6 05 12 96 04 08 03 movb $0x3,0x8049612
80483c5: c6 05 11 96 04 08 02 movb $0x2,0x8049611
80483cc: c6 05 10 96 04 08 01 movb $0x1,0x8049610
gcc-3.4.5 produces the following code:
/home/fm3/foo.c:16
8048391: ba 01 02 03 04 mov $0x4030201,%edx
/home/fm3/foo.c:15
8048396: 89 e5 mov %esp,%ebp
8048398: 83 ec 18 sub $0x18,%esp
804839b: 83 e4 f0 and $0xfffffff0,%esp
804839e: 83 ec 10 sub $0x10,%esp
/home/fm3/foo.c:16
80483a1: 89 15 1c 96 04 08 mov %edx,0x804961c
(better)
gcc-2.95.4 produces the following code:
/home/fm3/foo.c:16
80483f7: c7 05 84 96 04 08 01 movl $0x4030201,0x8049684
80483fe: 02 03 04
(best because no register allocation)
The example:
#include <stdio.h>
typedef struct
{
unsigned char a;
unsigned char b;
unsigned char c;
unsigned char d;
} type_t;
static type_t u;
int
main(void)
{
u = (type_t){ 1, 2, 3, 4};
printf("%d %d %d %d\n", u.a, u.b, u.c, u.d);
return 0;
}
gcc-4.0 -v -save-temps -g -o foo -W -Wall -Wformat=2 -O3 -Wall -W
-fomit-frame-pointer -march=pentium3 -g foo.c:
Using built-in specs.
Target: i486-linux
Configured with: ../src/configure -v
--enable-languages=c,c++,java,f95,objc,ada,treelang --prefix=/usr
--enable-shared --with-system-zlib --libexecdir=/usr/lib --enable-nls
--without-included-gettext --enable-threads=posix --program-suffix=-4.0
--enable-__cxa_atexit --enable-libstdcxx-allocator=mt --enable-clocale=gnu
--enable-libstdcxx-debug --enable-java-gc=boehm --enable-java-awt=gtk
--enable-mpfr --disable-werror --enable-checking=release i486-linux
Thread model: posix
gcc version 4.0.1 20050522 (prerelease) (Debian 4.0.0-9)
/usr/lib/gcc/i486-linux/4.0.1/cc1 -E -quiet -v foo.c -march=pentium3 -W -Wall
-Wformat=2 -Wall -W -fomit-frame-pointer -fworking-directory -O3
-fpch-preprocess -o foo.i
ignoring nonexistent directory
"/usr/lib/gcc/i486-linux/4.0.1/../../../../i486-linux/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/local/include
/usr/lib/gcc/i486-linux/4.0.1/include
/usr/include
End of search list.
/usr/lib/gcc/i486-linux/4.0.1/cc1 -fpreprocessed foo.i -quiet -dumpbase foo.c
-march=pentium3 -auxbase foo -g -g -O3 -W -Wall -Wformat=2 -Wall -W -version
-fomit-frame-pointer -o foo.s
GNU C version 4.0.1 20050522 (prerelease) (Debian 4.0.0-9) (i486-linux)
compiled by GNU C version 4.0.1 20050522 (prerelease) (Debian
4.0.0-9).
GGC heuristics: --param ggc-min-expand=64 --param ggc-min-heapsize=64260
as -V -Qy --32 -o foo.o foo.s
GNU assembler version 2.15 (i486-linux-gnu) using BFD version 2.15
/usr/lib/gcc/i486-linux/4.0.1/collect2 --eh-frame-hdr -m elf_i386
-dynamic-linker /lib/ld-linux.so.2 -o
foo /usr/lib/gcc/i486-linux/4.0.1/../../../../lib/crt1.o /usr/lib/gcc/i486-linux/4.0.1/../../../../lib/crti.o /usr/lib/gcc/i486-linux/4.0.1/crtbegin.o
-L/usr/lib/gcc/i486-linux/4.0.1 -L/usr/lib/gcc/i486-linux/4.0.1
-L/usr/lib/gcc/i486-linux/4.0.1/../../../../lib
-L/usr/lib/gcc/i486-linux/4.0.1/../../.. -L/lib/../lib -L/usr/lib/../lib foo.o
-lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s
--no-as-needed /usr/lib/gcc/i486-linux/4.0.1/crtend.o /usr/lib/gcc/i486-linux/4.0.1/../../../../lib/crtn.o
--
Summary: Missing optimization when storing structures
Product: gcc
Version: 4.0.1
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: c
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: fm3 at os dot inf dot tu-dresden dot de
CC: gcc-bugs at gcc dot gnu dot org
GCC host triplet: i486-linux
GCC target triplet: i486-linux
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=22141