http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46403

--- Comment #2 from davidxl <xinliangli at gmail dot com> 2010-11-10 17:50:37 
UTC ---
Yes, there is redundancy removed for a[x] -- but for *y, it should not be
duplicated. See the following example:


int a[100];
int foo(int x, int* y, int *yy, int *yyy, int z)
{ 
  int m; 
  if (x)
  {
     *y = z;
     *yy = z;
     *yyy = z;
     a[x]  = z;
  }
  m = *y; // *y misses often
  return m + *yy + *yyy + a[x];
}

foo:
.LFB0:
    .cfi_startproc
    testl    %edi, %edi
    je    .L5
    movl    %r8d, (%rsi)
    movslq    %edi, %rdi
    movl    %r8d, (%rdx)
    movl    %r8d, (%rcx)
    movl    %r8d, a(,%rdi,4)
    movl    (%rdx), %eax
    addl    (%rsi), %eax
    addl    (%rcx), %eax
    addl    %r8d, %eax
    ret
    .p2align 4,,10
    .p2align 3
.L5:
    movl    a(%rip), %r8d
    movl    (%rdx), %eax
    addl    (%rsi), %eax
    addl    (%rcx), %eax
    addl    %r8d, %eax
    ret
    .cfi_endproc




(In reply to comment #1)
> I don't see this PRE, instead I see
> 
> Found partial redundancy for expression {array_ref<x_1(D),0,4>,a...@.mem_7 
> (0005)
> Inserted pretmp.3_12 = a[x_1(D)];
>  in predecessor 5
> Created phi prephitmp.4_15 = PHI <pretmp.3_12(5), z_3(D)(3)>
>  in block 4
> Replaced a[x_1(D)] with prephitmp.4_15 in D.2691_5 = a[x_1(D)];
> 
> <bb 2>:
>   if (x_1(D) != 0)
>     goto <bb 3>;
>   else
>     goto <bb 5>;
> 
> <bb 5>:
>   pretmp.3_12 = a[x_1(D)];
>   goto <bb 4>;
> 
> <bb 3>:
>   *y_2(D) = z_3(D);
>   a[x_1(D)] = z_3(D);
> 
> <bb 4>:
>   # prephitmp.4_15 = PHI <pretmp.3_12(5), z_3(D)(3)>
>   m_4 = *y_2(D);
>   D.2691_5 = prephitmp.4_15;
>   D.2690_6 = D.2691_5 + m_4;
>   return D.2690_6;
> 
> which indeed removes a redundancy.  En/disabling RTL PRE doesn't change
> the generated code so you can't mean that either.

Reply via email to