Re: no Loop Invariant Motion?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Thanks a lot :)
However, what if I make variable a global?
Now it will be there in the assembly code.
#include<stdio.h>
int b, a=0;
int main ()
{
       while (a < 100)
       {
                       b = 10;
                       a = a + 1;
                       printf ("%d\n", a);
       }
       printf ("%d, %d\n", b, a);
       return 0;
}

If there is some LIM performed, then why is it not reflected in the .lim file?
Is it that such inexpensive loop invariant motions are not performed at all?
Are there any testcases on which LIM works?
Thanks in advance.


On Mon, Jan 4, 2010 at 12:34 AM, Bob Plantz <plantz@xxxxxxxx> wrote:
> 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
>>
>>
>>
>
>
>



-- 
With Regards,
Prashant SIngh Rawat
MTech, CSE, IIT Bombay


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux