This fixes another fallout of the PR65962 fix, gcc.dg/vect/vect-62.c failing for targets that use constant pool entries for the array initializer.
On x86_64 we fail to vectorize the 2nd loop in the testcase because PRE makes the latch block non-empty (and adds a loop carried dependency). The patch fixes the code that is supposed to inhibit PRE from doing this. Bootstrapped on x86_64-unknown-linux-gnu, testing in progress. Richard. 2015-10-27 Richard Biener <rguent...@suse.de> PR tree-optimization/65962 * tree-ssa-pre.c (eliminate_dom_walker::before_dom_children): Avoid creating loop carried dependences also for outer loops of the loop a use to replace is in. * gcc.dg/vect/vect-62.c: Adjust. Index: gcc/tree-ssa-pre.c =================================================================== *** gcc/tree-ssa-pre.c (revision 229404) --- gcc/tree-ssa-pre.c (working copy) *************** eliminate_dom_walker::before_dom_childre *** 4082,4089 **** gimple *def_stmt = SSA_NAME_DEF_STMT (sprime); basic_block def_bb = gimple_bb (def_stmt); if (gimple_code (def_stmt) == GIMPLE_PHI ! && b->loop_father->header == def_bb) { ssa_op_iter iter; tree op; bool found = false; --- 4090,4098 ---- gimple *def_stmt = SSA_NAME_DEF_STMT (sprime); basic_block def_bb = gimple_bb (def_stmt); if (gimple_code (def_stmt) == GIMPLE_PHI ! && def_bb->loop_father->header == def_bb) { + loop_p loop = def_bb->loop_father; ssa_op_iter iter; tree op; bool found = false; *************** eliminate_dom_walker::before_dom_childre *** 4092,4100 **** affine_iv iv; def_bb = gimple_bb (SSA_NAME_DEF_STMT (op)); if (def_bb ! && flow_bb_inside_loop_p (b->loop_father, def_bb) ! && simple_iv (b->loop_father, ! b->loop_father, op, &iv, true)) { found = true; break; --- 4101,4108 ---- affine_iv iv; def_bb = gimple_bb (SSA_NAME_DEF_STMT (op)); if (def_bb ! && flow_bb_inside_loop_p (loop, def_bb) ! && simple_iv (loop, loop, op, &iv, true)) { found = true; break; *************** eliminate_dom_walker::before_dom_childre *** 4110,4116 **** print_generic_expr (dump_file, sprime, 0); fprintf (dump_file, " which would add a loop" " carried dependence to loop %d\n", ! b->loop_father->num); } /* Don't keep sprime available. */ sprime = NULL_TREE; --- 4118,4124 ---- print_generic_expr (dump_file, sprime, 0); fprintf (dump_file, " which would add a loop" " carried dependence to loop %d\n", ! loop->num); } /* Don't keep sprime available. */ sprime = NULL_TREE; Index: gcc/testsuite/gcc.dg/vect/vect-62.c =================================================================== *** gcc/testsuite/gcc.dg/vect/vect-62.c (revision 229404) --- gcc/testsuite/gcc.dg/vect/vect-62.c (working copy) *************** int main1 () *** 33,41 **** } /* Multidimensional array. Aligned. The "inner" dimensions ! are invariant in the inner loop. Vectorizable, but the ! vectorizer detects that everything is invariant and that ! the loop is better left untouched. (it should be optimized away). */ for (i = 0; i < N; i++) { for (j = 0; j < N; j++) --- 33,40 ---- } /* Multidimensional array. Aligned. The "inner" dimensions ! are invariant in the inner loop. The outer loop is ! vectorizable after invariant/store motion. */ for (i = 0; i < N; i++) { for (j = 0; j < N; j++) *************** int main (void) *** 65,69 **** return main1 (); } ! /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */ /* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 0 "vect" } } */ --- 64,68 ---- return main1 (); } ! /* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" } } */ /* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 0 "vect" } } */