The vectorizer does not honor the fact that debug statements do not participate in loop-closed-SSA construction and thus a SSA name can have outside loop uses that are not in the loop-closed PHI node but in a debug statement.
Bootstrapped on x86_64-unknown-linux-gnu, testing in progress. Richard. 2013-09-26 Richard Biener <rguent...@suse.de> PR tree-optimization/58539 * tree-vect-loop.c (vect_create_epilog_for_reduction): Honor the fact that debug statements are not taking part in loop-closed SSA construction. * gcc.dg/torture/pr58539.c: New testcase. Index: gcc/tree-vect-loop.c =================================================================== *** gcc/tree-vect-loop.c (revision 202883) --- gcc/tree-vect-loop.c (working copy) *************** vect_finalize_reduction: *** 4411,4417 **** result. (The reduction result is expected to have two immediate uses - one at the latch block, and one at the loop exit). */ FOR_EACH_IMM_USE_FAST (use_p, imm_iter, scalar_dest) ! if (!flow_bb_inside_loop_p (loop, gimple_bb (USE_STMT (use_p)))) phis.safe_push (USE_STMT (use_p)); /* While we expect to have found an exit_phi because of loop-closed-ssa --- 4411,4418 ---- result. (The reduction result is expected to have two immediate uses - one at the latch block, and one at the loop exit). */ FOR_EACH_IMM_USE_FAST (use_p, imm_iter, scalar_dest) ! if (!flow_bb_inside_loop_p (loop, gimple_bb (USE_STMT (use_p))) ! && !is_gimple_debug (USE_STMT (use_p))) phis.safe_push (USE_STMT (use_p)); /* While we expect to have found an exit_phi because of loop-closed-ssa *************** vect_finalize_reduction: *** 4541,4547 **** FOR_EACH_IMM_USE_FAST (use_p, imm_iter, scalar_dest) { if (!flow_bb_inside_loop_p (loop, gimple_bb (USE_STMT (use_p)))) ! phis.safe_push (USE_STMT (use_p)); else { if (double_reduc && gimple_code (USE_STMT (use_p)) == GIMPLE_PHI) --- 4542,4551 ---- FOR_EACH_IMM_USE_FAST (use_p, imm_iter, scalar_dest) { if (!flow_bb_inside_loop_p (loop, gimple_bb (USE_STMT (use_p)))) ! { ! if (!is_gimple_debug (USE_STMT (use_p))) ! phis.safe_push (USE_STMT (use_p)); ! } else { if (double_reduc && gimple_code (USE_STMT (use_p)) == GIMPLE_PHI) *************** vect_finalize_reduction: *** 4551,4557 **** FOR_EACH_IMM_USE_FAST (phi_use_p, phi_imm_iter, phi_res) { if (!flow_bb_inside_loop_p (loop, ! gimple_bb (USE_STMT (phi_use_p)))) phis.safe_push (USE_STMT (phi_use_p)); } } --- 4555,4562 ---- FOR_EACH_IMM_USE_FAST (phi_use_p, phi_imm_iter, phi_res) { if (!flow_bb_inside_loop_p (loop, ! gimple_bb (USE_STMT (phi_use_p))) ! && !is_gimple_debug (USE_STMT (phi_use_p))) phis.safe_push (USE_STMT (phi_use_p)); } } Index: gcc/testsuite/gcc.dg/torture/pr58539.c =================================================================== *** gcc/testsuite/gcc.dg/torture/pr58539.c (revision 0) --- gcc/testsuite/gcc.dg/torture/pr58539.c (working copy) *************** *** 0 **** --- 1,20 ---- + /* { dg-do compile } */ + /* { dg-options "-g" } */ + + int a, b; + + extern void baz (int); + + int foo (int p) + { + return p ? p : 1; + } + + void bar () + { + int *c = &a, *d = &a; + for (b = 0; b < 12; b++) + *d |= 1; + foo (*c); + baz (*c && 1); + }