This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug tree-optimization/49872] New: Missed optimization: Could coalesce neighboring memsets
- From: "sgunderson at bigfoot dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Wed, 27 Jul 2011 16:51:35 +0000
- Subject: [Bug tree-optimization/49872] New: Missed optimization: Could coalesce neighboring memsets
- Auto-submitted: auto-generated
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: unassigned@gcc.gnu.org
ReportedBy: sgunderson@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;.