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.