This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
RE: gcc loop unrolling problem ??
- From: "Konark Goel, Noida" <konarkg at noida dot hcltech dot com>
- To: Jan Hubicka <hubicka at ucw dot cz>
- Cc: gcc at gcc dot gnu dot org
- Date: Thu, 12 Feb 2004 16:58:07 +0530
- Subject: RE: gcc loop unrolling problem ??
Actually -O3 generated code looks better than the code generated by -O3 and
- funroll-all-loops condition combined. it is better optimized, so i think
it both the conditions should generate the code generated by -O3 as it is
more optimized.
Also why is the loop being unrolled only 8 times ? even after changing
switch values it unrolls to 8 times only...? is there something special
about this no. 8 ?
thanks,
Kon ??
"The answer is out there....,
Its the question that drives us...."
-----Original Message-----
From: Jan Hubicka [mailto:hubicka@ucw.cz]
Sent: Thursday, February 12, 2004 4:14 PM
To: Konark Goel, Noida
Cc: gcc@gcc.gnu.org
Subject: Re: gcc loop unrolling problem ??
>
> I compiled a gcc testcase with only -O3 option and also with -O3 and
> -funroll-all-loops options combined.... For the first case (-O3 option) it
> is generating quite a correct assembly...but in case of -funroll-all-loops
> it is generating quite a no. of calls, which actually is not needed. I
guess
> there's some problem in it. Also the no. of calls being generated is
> dependent upon the minimum and maximum values in the switch cases !!
>
> the testcase is this :
>
> /* TestCase starts here */
> extern int getch();
> extern int class();
>
> int
> token()
> {
> int state = 1;
>
> while (1) {
> int c=0;
> c = getch();
> switch (state) {
> case 1: break;
> case 4: break;
> case 5: break;
> case 6:
> {
> switch (class(c)) {
> default: break;
> }
> } break;
> case 7: break;
> }
> }
> }
> /* TestCase ends.....*/
>
>
> ;Assembly for -O3 -funroll-all-loops case ....
>
> .file "990801-1.c"
> .text
> .p2align 2,,3
> .globl token
> .type token,@function
> token:
> pushl %ebp
> movl %esp, %ebp
> subl $8, %esp
> .p2align 2,,3
> .L16:
> call getch
> call getch
> call getch
> call getch
> call getch
> call getch
> call getch
> call getch
> jmp .L16
> .Lfe1:
> .size token,.Lfe1-token
> .ident "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
>
>
> ;assembly for only -O3 condition...
>
> .file "990801-1.c"
> .text
> .p2align 2,,3
> .globl token
> .type token,@function
> token:
> pushl %ebp
> movl %esp, %ebp
> subl $8, %esp
> .p2align 2,,3
> .L16:
> call getch
> jmp .L16
> .Lfe1:
> .size token,.Lfe1-token
> .ident "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
>
> ;assembly ends..
>
>
> as is clear it creates a strange assembly with -O3 -funroll-all-loops
> option......Is this a BUG ??
I think it is just result of unrolling+constant propagation of "state",
so it looks like valid transformation to me. Why do you think it is
strange?
Honza
>
> hoping to get a quick response..
>
> thanks,
> Kon ??
> "The answer is out there....,
> Its the question that drives us...."