http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49872
Summary: Missed optimization: Could coalesce neighboring memsets Product: gcc Version: 4.7.0 Status: UNCONFIRMED Severity: enhancement Priority: P3 Component: tree-optimization AssignedTo: unassig...@gcc.gnu.org ReportedBy: sgunder...@bigfoot.com Given the following code: #include <string.h> struct S { int f[1024]; int g[1024]; }; void func(struct S* s) { memset(s->f, 0, sizeof(s->f)); memset(s->g, 0, sizeof(s->g)); } GCC currently generates two memsets. The code with -O2 is a bit hard to read, so I'm just pasting the -Os assembly for clarity: 00000000 <func>: 0: 55 push %ebp 1: 31 c0 xor %eax,%eax 3: 89 e5 mov %esp,%ebp 5: b9 00 04 00 00 mov $0x400,%ecx a: 57 push %edi b: 8b 7d 08 mov 0x8(%ebp),%edi e: f3 ab rep stos %eax,%es:(%edi) 10: 8b 55 08 mov 0x8(%ebp),%edx 13: 66 b9 00 04 mov $0x400,%cx 17: 81 c2 00 10 00 00 add $0x1000,%edx 1d: 89 d7 mov %edx,%edi 1f: f3 ab rep stos %eax,%es:(%edi) 21: 5f pop %edi 22: 5d pop %ebp 23: c3 ret Ideally GCC should also be able to coalesce this together with memsets not written as memset, e.g. s->g[0] = 0;.