This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: no Loop Invariant Motion?


Forgot to say that I added my own comments to the assembly language
code.

On Sun, 2010-01-03 at 10:40 -0800, Bob Plantz wrote:
> On Sun, 2010-01-03 at 11:24 +0530, prashant rawat wrote:
> > I have a simple C code :
> > 
> > #include<stdio.h>
> > int *c;
> > int main ()
> > {
> >         int a=0, b;
> >         while (a < 100)
> >         {
> >                         b = 10;
> >                         a = a + 1;
> >         }
> >         c = &b;
> >         printf ("%d\n", *c);
> >         return 0;
> > }
> > 
> > I would basically expect the b = 10 statement to be moved out of the
> > while loop, as it is an invariant.
> > However, it does not seem to happen in the *.lim dump file.
> > I am using gcc 4.4.2 to compile, and the cmd line options are
> > install/bin/gcc -fdump-tree-all -O3 filename.c
> > 
> > Can anyone explain what went wrong?
> > 
> 
> My version of gcc (4.4.1) completely eliminates the loop since it it
> irrelevant. Notice that a is not used beyond the loop. gcc generates the
> following assembly language:
> 
> 	.file	"loop_invar.c"
> 	.section	.rodata.str1.1,"aMS",@progbits,1
> .LC0:
> 	.string	"%d\n"
> 	.text
> 	.p2align 4,,15
> .globl main
> 	.type	main, @function
> main:
> .LFB22:
> 	.cfi_startproc
> 	subq	$24, %rsp
> 	.cfi_def_cfa_offset 32
> 	movl	$10, %edx      # 3rd argument to printf
> 	movl	$.LC0, %esi    # address of format string
> 	leaq	12(%rsp), %rax # address of b
> 	movl	$1, %edi       # check stack overflow
> 	movl	$10, 12(%rsp)  # b = 10;
> 	movq	%rax, c(%rip)  # c = &b;
> 	xorl	%eax, %eax     # no floats
> 	call	__printf_chk
> 	xorl	%eax, %eax     # return 0;
> 	addq	$24, %rsp
> 	ret
> 	.cfi_endproc
> .LFE22:
> 	.size	main, .-main
> 	.comm	c,8,8
> 	.ident	"GCC: (Ubuntu 4.4.1-4ubuntu8) 4.4.1"
> 	.section	.note.GNU-stack,"",@progbits
> 
> which is the equivalent of:
> #include<stdio.h>
> int *c;
> int main ()
> {
>         int b;
>         b = 10;
>         c = &b;
>         printf ("%d\n", 10);
>         return 0;
> }
> 
> --Bob
> 
> 
> 



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]