about unroll loops
Zack Weinberg
zack@codesourcery.com
Fri Nov 29 07:04:00 GMT 2002
"Ö£¬B" <taurus-zheng@163.com> writes:
> I am a new user of gcc.
> I have written a small code loop.c like this:
> main()
> {
> int a[16];
> int i;
> for(i=0;i<16;i++)
> a[i]=3;
> return;
> }
> I wanted to unroll the loop, so I compile it use the command
> "gcc -unroll-all-loops -S loop.c", then I look up the loop.s,
> but the loop is not unroolled. Please tell me the reason.
1) The option you want is spelled "-funroll-all-loops".
2) You must also enable optimization, with the -O or -O2 switches.
When I do that with your test case I get
main:
pushl %ebp
movl %esp, %ebp
subl $72, %esp
andl $-16, %esp
leave
ret
There is no loop because, with optimization on, GCC realizes that the
array 'a' is never used after it's initialized, so it can delete the
initialization.
A slight modification of your test case:
extern int a[16];
void foo()
{
int i;
for(i=0;i<16;i++)
a[i]=3;
}
compiled with -O -funroll-all-loops, produces
foo:
pushl %ebp
movl %esp, %ebp
movl $3, a
movl $3, a+4
movl $3, a+8
movl $3, a+12
movl $3, a+16
movl $3, a+20
movl $3, a+24
movl $3, a+28
movl $3, a+32
movl $3, a+36
movl $3, a+40
movl $3, a+44
movl $3, a+48
movl $3, a+52
movl $3, a+56
movl $3, a+60
leave
ret
which, I believe, is more like what you are looking for. Here GCC
cannot assume that the stores to the array are dead, because it is
visible outside the function.
zw
p.s. Your message lacks a proper character set label, so I see your
name and your sigfile as gobbledygook. Please fix this.
More information about the Gcc
mailing list