Created attachment 23035 [details] reduced testcase Reported by Vegard Nossum at IRC. Output: $ gcc-4.5 -O -ftree-pre testcase.c $ ./a.out Aborted In the testcase.c.092t.pre dump, there is: ... <bb 2>: D.2739_4 = b.a[0].i; i.0_5 = i; if (D.2739_4 != i.0_5) goto <bb 3>; else goto <bb 4>; <bb 3>: b.a[0] = b.a[1]; b.a[1].i = D.2739_4; pretmp.3_6 = b.a[1].i; goto <bb 6>; <bb 4>: ... <bb 9>: <bb 6>: # prephitmp.4_8 = PHI <D.2739_4(9), pretmp.3_6(3)> D.2739_9 = prephitmp.4_8; D.2739_9 = prephitmp.4_8; if (D.2739_9 == 0) goto <bb 7>; ... Problematic line is pretmp.3_6 = b.a[1].i; which reads the new value of "b.a[1].i". It should either happen one line earlier, or it should read "b.a[0].i". It seems that the fact "b.a[0] = b.a[1]" overwrites "b.a[0].i" is ignored. Of couse I can be wrong. Tested revisions: r169006 - OK 4.5 r168785 - fail 4.4 r168785 - OK
Confirmed and mine.
What happens is that when translating D.2739_9 = b.a[0].i; from bb6 to bb3 value-numbering does look through the aggregate copy b.a[0] = b.a[1]; continuing to look for b.a[1].i and finding D.2737_7 = b.a[1].i; from bb4 (which is ok - the consumer has to check availability). Thus b.a[1].i ends up in antic-out (not a problem) with a new value-number, it doesn't end up in antic-in of bb3. b.a[0].i is partially redundant in bb6, D.2739_4 is correctly found as the available expression for it via bb6. But when we translate b.a[0].i to bb3 again during insertion we again obtain b.a[1].i (because it's also still in the phi-translation cache). It is obviously not available here so we insert it. Oops. We don't prune invalid translations during insertion - that's the basic problem. We'd expect to find a leader as the translated expression has a SCCVN value-number. The problem is latent on trunk.
(In reply to comment #2) > The problem is latent on trunk. Updating the summary to show in the 4.6 regression list.
Author: rguenth Date: Fri Jan 21 14:02:41 2011 New Revision: 169089 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=169089 Log: 2011-01-21 Richard Guenther <rguenther@suse.de> PR tree-optimization/47365 * tree-ssa-sccvn.h (vn_lookup_kind): Declare. (vn_reference_lookup_pieces): Adjust. (vn_reference_lookup): Likewise. * tree-ssa-sccvn.c (vn_walk_kind): New static global. (vn_reference_lookup_3): Only look through kills if in VN_WALKREWRITE mode. (vn_reference_lookup_pieces): Adjust. (vn_reference_lookup): Likewise. (visit_reference_op_load): Likewise. (visit_reference_op_store): Likewise. * tree-ssa-pre.c (phi_translate_1): Use VN_WALK mode. (compute_avail): Likewise. (eliminate): Likewise. * gcc.dg/torture/pr47365.c: New testcase. * gcc.dg/tree-ssa/pr47392.c: Likewise. Added: trunk/gcc/testsuite/gcc.dg/torture/pr47365.c trunk/gcc/testsuite/gcc.dg/tree-ssa/pr47392.c Modified: trunk/gcc/ChangeLog trunk/gcc/testsuite/ChangeLog trunk/gcc/tree-ssa-pre.c trunk/gcc/tree-ssa-sccvn.c trunk/gcc/tree-ssa-sccvn.h
Author: rguenth Date: Fri Jan 21 14:05:00 2011 New Revision: 169090 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=169090 Log: 2011-01-21 Richard Guenther <rguenther@suse.de> PR tree-optimization/47365 * tree-ssa-sccvn.h (vn_lookup_kind): Declare. (vn_reference_lookup_pieces): Adjust. (vn_reference_lookup): Likewise. * tree-ssa-sccvn.c (vn_walk_kind): New static global. (vn_reference_lookup_3): Only look through kills if in VN_WALKREWRITE mode. (vn_reference_lookup_pieces): Adjust. (vn_reference_lookup): Likewise. (visit_reference_op_load): Likewise. (visit_reference_op_store): Likewise. * tree-ssa-pre.c (phi_translate_1): Use VN_WALK mode. (compute_avail): Likewise. (eliminate): Likewise. * gcc.dg/torture/pr47365.c: New testcase. * gcc.dg/tree-ssa/pr47392.c: Likewise. Added: branches/gcc-4_5-branch/gcc/testsuite/gcc.dg/torture/pr47365.c branches/gcc-4_5-branch/gcc/testsuite/gcc.dg/tree-ssa/pr47392.c Modified: branches/gcc-4_5-branch/gcc/ChangeLog branches/gcc-4_5-branch/gcc/testsuite/ChangeLog branches/gcc-4_5-branch/gcc/tree-ssa-pre.c branches/gcc-4_5-branch/gcc/tree-ssa-sccvn.c branches/gcc-4_5-branch/gcc/tree-ssa-sccvn.h
Fixed.