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)

Reply via email to