re PR tree-optimization/48290 (FAIL: gcc.dg/vect/pr38529.c, ICE in vect_get_vec_def_f...
authorIra Rosen <ira.rosen@linaro.org>
Tue, 29 Mar 2011 10:26:25 +0000 (10:26 +0000)
committerIra Rosen <irar@gcc.gnu.org>
Tue, 29 Mar 2011 10:26:25 +0000 (10:26 +0000)
        PR tree-optimization/48290
        * tree-vect-loop.c (vect_analyze_loop_operations): In outer loop
        vectorization, check that relevant phis in the basic block after
        the inner loop are really inner loop's exit phis.

From-SVN: r171657

gcc/ChangeLog
gcc/tree-vect-loop.c

index 323da28e5a06f62bf33b59e7a6e82dee2d6a4491..ff341cf16d2a6ec454bbac0e41522ba112bfb236 100644 (file)
@@ -1,3 +1,10 @@
+2011-03-29  Ira Rosen  <ira.rosen@linaro.org>
+
+       PR tree-optimization/48290
+       * tree-vect-loop.c (vect_analyze_loop_operations): In outer loop
+       vectorization, check that relevant phis in the basic block after
+       the inner loop are really inner loop's exit phis.
+
 2011-03-29  Richard Sandiford  <richard.sandiford@linaro.org>
 
        PR debug/48190
index 690d9b7401eabc309709a7aa6068209ef2ed3460..5fecf2a052497a17121eb719cd81979e26632847 100644 (file)
@@ -1184,11 +1184,11 @@ vect_analyze_loop_operations (loop_vec_info loop_vinfo)
               print_gimple_stmt (vect_dump, phi, 0, TDF_SLIM);
             }
 
+          /* Inner-loop loop-closed exit phi in outer-loop vectorization
+             (i.e., a phi in the tail of the outer-loop).  */
           if (! is_loop_header_bb_p (bb))
             {
-              /* inner-loop loop-closed exit phi in outer-loop vectorization
-                 (i.e. a phi in the tail of the outer-loop).
-                 FORNOW: we currently don't support the case that these phis
+              /* FORNOW: we currently don't support the case that these phis
                  are not used in the outerloop (unless it is double reduction,
                  i.e., this phi is vect_reduction_def), cause this case
                  requires to actually do something here.  */
@@ -1202,6 +1202,32 @@ vect_analyze_loop_operations (loop_vec_info loop_vinfo)
                              "Unsupported loop-closed phi in outer-loop.");
                   return false;
                 }
+
+              /* If PHI is used in the outer loop, we check that its operand
+                 is defined in the inner loop.  */
+              if (STMT_VINFO_RELEVANT_P (stmt_info))
+                {
+                  tree phi_op;
+                  gimple op_def_stmt;
+
+                  if (gimple_phi_num_args (phi) != 1)
+                    return false;
+
+                  phi_op = PHI_ARG_DEF (phi, 0);
+                  if (TREE_CODE (phi_op) != SSA_NAME)
+                    return false;
+
+                  op_def_stmt = SSA_NAME_DEF_STMT (phi_op);
+                  if (!op_def_stmt || !vinfo_for_stmt (op_def_stmt))
+                    return false;
+
+                  if (STMT_VINFO_RELEVANT (vinfo_for_stmt (op_def_stmt))
+                        != vect_used_in_outer
+                      && STMT_VINFO_RELEVANT (vinfo_for_stmt (op_def_stmt))
+                           != vect_used_in_outer_by_reduction)
+                    return false;
+                }
+
               continue;
             }