Array initialization could use memset builtin function. In following two testcases, array is initialized without use of memset:
--cut here-- long long foo(long long *); long long test1(void) { long long a[32]; a[0] = 0; a[1] = 0; a[2] = 0; a[3] = 0; a[4] = 0; a[5] = 0; a[6] = 0; a[7] = 0; a[8] = 0; a[9] = 0; a[10] = 0; a[11] = 0; a[12] = 0; a[13] = 0; a[14] = 0; a[15] = 0; a[16] = 0; a[17] = 0; a[18] = 0; a[19] = 0; a[20] = 0; a[21] = 0; a[22] = 0; a[23] = 0; a[24] = 0; a[25] = 0; a[26] = 0; a[27] = 0; a[28] = 0; a[29] = 0; a[30] = 0; a[31] = 0; return foo(a); } long long test2(void) { long long a[32]; int i; for (i = 0; i < 32; i++) a[i] = 0; return foo(a); } --cut here-- gcc -O3 -m32 -S -fomit-frame-pointer test1: subl $268, %esp leal 8(%esp), %eax movl $0, 8(%esp) movl $0, 12(%esp) movl $0, 16(%esp) movl $0, 20(%esp) movl $0, 24(%esp) movl $0, 28(%esp) movl $0, 32(%esp) movl $0, 36(%esp) movl $0, 40(%esp) movl $0, 44(%esp) movl $0, 48(%esp) movl $0, 52(%esp) movl $0, 56(%esp) movl $0, 60(%esp) movl $0, 64(%esp) movl $0, 68(%esp) movl $0, 72(%esp) movl $0, 76(%esp) movl $0, 80(%esp) movl $0, 84(%esp) movl $0, 88(%esp) movl $0, 92(%esp) movl $0, 96(%esp) movl $0, 100(%esp) movl $0, 104(%esp) movl $0, 108(%esp) movl $0, 112(%esp) movl $0, 116(%esp) movl $0, 120(%esp) movl $0, 124(%esp) movl $0, 128(%esp) movl $0, 132(%esp) movl $0, 136(%esp) movl $0, 140(%esp) movl $0, 144(%esp) movl $0, 148(%esp) movl $0, 152(%esp) movl $0, 156(%esp) movl $0, 160(%esp) movl $0, 164(%esp) movl $0, 168(%esp) movl $0, 172(%esp) movl $0, 176(%esp) movl $0, 180(%esp) movl $0, 184(%esp) movl $0, 188(%esp) movl $0, 192(%esp) movl $0, 196(%esp) movl $0, 200(%esp) movl $0, 204(%esp) movl $0, 208(%esp) movl $0, 212(%esp) movl $0, 216(%esp) movl $0, 220(%esp) movl $0, 224(%esp) movl $0, 228(%esp) movl $0, 232(%esp) movl $0, 236(%esp) movl $0, 240(%esp) movl $0, 244(%esp) movl $0, 248(%esp) movl $0, 252(%esp) movl $0, 256(%esp) movl $0, 260(%esp) movl %eax, (%esp) call foo addl $268, %esp ret test2: subl $268, %esp movl $2, %eax movl $0, 8(%esp) leal 8(%esp), %edx movl $0, 12(%esp) .p2align 4,,7 .L2: movl $0, -8(%edx,%eax,8) movl $0, -4(%edx,%eax,8) addl $1, %eax cmpl $33, %eax jne .L2 movl %edx, (%esp) call foo addl $268, %esp ret IIRC, this optimization was recently implemented in gfrortran... -- Summary: Array initialization can use memset builtin function Product: gcc Version: 4.3.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: ubizjak at gmail dot com GCC build triplet: i686-pc-linux-gnu GCC host triplet: i686-pc-linux-gnu GCC target triplet: i686-pc-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30442