On Mon, Nov 14, 2011 at 9:01 AM, Jiangning Liu <jiangning....@arm.com> wrote:
> Hi,
>
> For this test case,
>
> int x;
> extern void f(void);
>
> void g(int *a)
> {
>        a[x] = 1;
>        if (x == 100)
>                f();
>        a[x] = 2;
> }
>
> For trunk, the x86 assembly code is like below,
>
>        movl    x, %eax
>        movl    16(%esp), %ebx
>        movl    $1, (%ebx,%eax,4)
>        movl    x, %eax   // Is this a redundant one?
>        cmpl    $100, %eax
>        je      .L4
>        movl    $2, (%ebx,%eax,4)
>        addl    $8, %esp
>        .cfi_remember_state
>        .cfi_def_cfa_offset 8
>        popl    %ebx
>        .cfi_restore 3
>        .cfi_def_cfa_offset 4
>        ret
>        .p2align 4,,7
>        .p2align 3
> .L4:
>        .cfi_restore_state
>        call    f
>        movl    x, %eax
>        movl    $2, (%ebx,%eax,4)
>        addl    $8, %esp
>        .cfi_def_cfa_offset 8
>        popl    %ebx
>        .cfi_restore 3
>        .cfi_def_cfa_offset 4
>        Ret
>
> Is the 2nd "movl x, %eax" is a redundant one for single thread programming
> model? If yes, can this be optimized away?

f() may change the value of x, so you cannot optimize away the load on that
execution path.

> Thanks,
> -Jiangning
>
>
>
>

Reply via email to