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>,[email protected]_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.