re PR tree-optimization/48290 (FAIL: gcc.dg/vect/pr38529.c, ICE in vect_get_vec_def_for_operand, at tree-vect-stmts.c:1072)

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
This commit is contained in:
Ira Rosen 2011-03-29 10:26:25 +00:00 committed by Ira Rosen
parent e8cf17e7e0
commit 86c8d1f646
2 changed files with 36 additions and 3 deletions

View 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

View 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;
}