http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50328
--- Comment #2 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-09-08 13:36:23 UTC --- With the following untested patch we apply outer loop vectorization. Index: gcc/tree-vect-loop.c =================================================================== --- gcc/tree-vect-loop.c (revision 178687) +++ gcc/tree-vect-loop.c (working copy) @@ -2149,7 +2149,7 @@ vect_is_simple_reduction_1 (loop_vec_inf op1 = gimple_assign_rhs1 (def_stmt); op2 = gimple_assign_rhs2 (def_stmt); - if (TREE_CODE (op1) != SSA_NAME || TREE_CODE (op2) != SSA_NAME) + if (TREE_CODE (op1) != SSA_NAME && TREE_CODE (op2) != SSA_NAME) { if (vect_print_dump_info (REPORT_DETAILS)) report_vect_op (def_stmt, "reduction: uses not ssa_names: "); @@ -2255,7 +2255,7 @@ vect_is_simple_reduction_1 (loop_vec_inf def2 = SSA_NAME_DEF_STMT (op2); if (code != COND_EXPR - && (!def1 || !def2 || gimple_nop_p (def1) || gimple_nop_p (def2))) + && ((!def1 && !def2) || (gimple_nop_p (def1) && gimple_nop_p (def2)))) { if (vect_print_dump_info (REPORT_DETAILS)) report_vect_op (def_stmt, "reduction: no defs for operands: "); @@ -2268,6 +2268,7 @@ vect_is_simple_reduction_1 (loop_vec_inf if (def2 && def2 == phi && (code == COND_EXPR + || !def1 || (def1 && flow_bb_inside_loop_p (loop, gimple_bb (def1)) && (is_gimple_assign (def1) || is_gimple_call (def1) @@ -2285,6 +2286,7 @@ vect_is_simple_reduction_1 (loop_vec_inf if (def1 && def1 == phi && (code == COND_EXPR + || !def2 || (def2 && flow_bb_inside_loop_p (loop, gimple_bb (def2)) && (is_gimple_assign (def2) || is_gimple_call (def2)