From tree dump we can see that there are two assignments from x, one to unsigned and one to signed. I guess that's the reason. Apparently there is room to improve though.
int prephitmp.8; int * D.2027; unsigned int D.2026; unsigned int x.1; int x.0; # BLOCK 2 freq:10000 # PRED: ENTRY [100.0%] (fallthru,exec) x.0_1 = x; x.1_2 = (unsigned int) x.0_1; // unsigned move D.2026_3 = x.1_2 * 4; D.2027_5 = a_4(D) + D.2026_3; *D.2027_5 = 1; prephitmp.8_6 = x; // signed move On Mon, Nov 14, 2011 at 4:01 PM, 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? > > Thanks, > -Jiangning > > > >