re PR tree-optimization/92554 (ICE in vect_create_epilog_for_reduction, at tree-vect-loop.c:4325)
2019-11-19 Richard Biener <rguenther@suse.de> PR tree-optimization/92554 * tree-vect-loop.c (vect_create_epilog_for_reduction): Look for the actual condition stmt and deal with sign-changes. * gcc.dg/vect/pr92554.c: New testcase. From-SVN: r278431
This commit is contained in:
parent
f1e0c7e0eb
commit
04c4599d30
@ -1,4 +1,10 @@
|
|||||||
2019-09-19 Richard Biener <rguenther@suse.de>
|
2019-11-19 Richard Biener <rguenther@suse.de>
|
||||||
|
|
||||||
|
PR tree-optimization/92554
|
||||||
|
* tree-vect-loop.c (vect_create_epilog_for_reduction): Look
|
||||||
|
for the actual condition stmt and deal with sign-changes.
|
||||||
|
|
||||||
|
2019-11-19 Richard Biener <rguenther@suse.de>
|
||||||
|
|
||||||
PR tree-optimization/92555
|
PR tree-optimization/92555
|
||||||
* tree-vect-loop.c (vect_update_vf_for_slp): Also scan PHIs
|
* tree-vect-loop.c (vect_update_vf_for_slp): Also scan PHIs
|
||||||
|
@ -1,4 +1,9 @@
|
|||||||
2019-09-19 Richard Biener <rguenther@suse.de>
|
2019-11-19 Richard Biener <rguenther@suse.de>
|
||||||
|
|
||||||
|
PR tree-optimization/92554
|
||||||
|
* gcc.dg/vect/pr92554.c: New testcase.
|
||||||
|
|
||||||
|
2019-11-19 Richard Biener <rguenther@suse.de>
|
||||||
|
|
||||||
PR tree-optimization/92555
|
PR tree-optimization/92555
|
||||||
* gcc.dg/vect/pr92555.c: New testcase.
|
* gcc.dg/vect/pr92555.c: New testcase.
|
||||||
|
11
gcc/testsuite/gcc.dg/vect/pr92554.c
Normal file
11
gcc/testsuite/gcc.dg/vect/pr92554.c
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
/* { dg-do compile } */
|
||||||
|
|
||||||
|
short int w9;
|
||||||
|
|
||||||
|
void __attribute__ ((simd))
|
||||||
|
zc (int in)
|
||||||
|
{
|
||||||
|
int va = 1;
|
||||||
|
|
||||||
|
w9 *= va != 0 ? in < 0 : 0;
|
||||||
|
}
|
@ -4552,12 +4552,21 @@ vect_create_epilog_for_reduction (stmt_vec_info stmt_info,
|
|||||||
zeroes. */
|
zeroes. */
|
||||||
if (STMT_VINFO_REDUC_TYPE (reduc_info) == COND_REDUCTION)
|
if (STMT_VINFO_REDUC_TYPE (reduc_info) == COND_REDUCTION)
|
||||||
{
|
{
|
||||||
tree indx_before_incr, indx_after_incr;
|
stmt_vec_info cond_info = STMT_VINFO_REDUC_DEF (reduc_info);
|
||||||
poly_uint64 nunits_out = TYPE_VECTOR_SUBPARTS (vectype);
|
cond_info = vect_stmt_to_vectorize (cond_info);
|
||||||
|
while (gimple_assign_rhs_code (cond_info->stmt) != COND_EXPR)
|
||||||
gimple *vec_stmt = STMT_VINFO_VEC_STMT (stmt_info)->stmt;
|
{
|
||||||
|
cond_info
|
||||||
|
= loop_vinfo->lookup_def (gimple_op (cond_info->stmt,
|
||||||
|
1 + STMT_VINFO_REDUC_IDX
|
||||||
|
(cond_info)));
|
||||||
|
cond_info = vect_stmt_to_vectorize (cond_info);
|
||||||
|
}
|
||||||
|
gimple *vec_stmt = STMT_VINFO_VEC_STMT (cond_info)->stmt;
|
||||||
gcc_assert (gimple_assign_rhs_code (vec_stmt) == VEC_COND_EXPR);
|
gcc_assert (gimple_assign_rhs_code (vec_stmt) == VEC_COND_EXPR);
|
||||||
|
|
||||||
|
tree indx_before_incr, indx_after_incr;
|
||||||
|
poly_uint64 nunits_out = TYPE_VECTOR_SUBPARTS (vectype);
|
||||||
int scalar_precision
|
int scalar_precision
|
||||||
= GET_MODE_PRECISION (SCALAR_TYPE_MODE (TREE_TYPE (vectype)));
|
= GET_MODE_PRECISION (SCALAR_TYPE_MODE (TREE_TYPE (vectype)));
|
||||||
tree cr_index_scalar_type = make_unsigned_type (scalar_precision);
|
tree cr_index_scalar_type = make_unsigned_type (scalar_precision);
|
||||||
@ -4611,9 +4620,9 @@ vect_create_epilog_for_reduction (stmt_vec_info stmt_info,
|
|||||||
(CCOMPARE). The then and else values mirror the main VEC_COND_EXPR:
|
(CCOMPARE). The then and else values mirror the main VEC_COND_EXPR:
|
||||||
the reduction phi corresponds to NEW_PHI_TREE and the new values
|
the reduction phi corresponds to NEW_PHI_TREE and the new values
|
||||||
correspond to INDEX_BEFORE_INCR. */
|
correspond to INDEX_BEFORE_INCR. */
|
||||||
gcc_assert (STMT_VINFO_REDUC_IDX (stmt_info) >= 1);
|
gcc_assert (STMT_VINFO_REDUC_IDX (cond_info) >= 1);
|
||||||
tree index_cond_expr;
|
tree index_cond_expr;
|
||||||
if (STMT_VINFO_REDUC_IDX (stmt_info) == 2)
|
if (STMT_VINFO_REDUC_IDX (cond_info) == 2)
|
||||||
index_cond_expr = build3 (VEC_COND_EXPR, cr_index_vector_type,
|
index_cond_expr = build3 (VEC_COND_EXPR, cr_index_vector_type,
|
||||||
ccompare, indx_before_incr, new_phi_tree);
|
ccompare, indx_before_incr, new_phi_tree);
|
||||||
else
|
else
|
||||||
@ -4809,10 +4818,11 @@ vect_create_epilog_for_reduction (stmt_vec_info stmt_info,
|
|||||||
be zero. */
|
be zero. */
|
||||||
|
|
||||||
/* Vector of {0, 0, 0,...}. */
|
/* Vector of {0, 0, 0,...}. */
|
||||||
tree zero_vec = make_ssa_name (vectype);
|
tree zero_vec = build_zero_cst (vectype);
|
||||||
tree zero_vec_rhs = build_zero_cst (vectype);
|
|
||||||
gimple *zero_vec_stmt = gimple_build_assign (zero_vec, zero_vec_rhs);
|
gimple_seq stmts = NULL;
|
||||||
gsi_insert_before (&exit_gsi, zero_vec_stmt, GSI_SAME_STMT);
|
new_phi_result = gimple_convert (&stmts, vectype, new_phi_result);
|
||||||
|
gsi_insert_seq_before (&exit_gsi, stmts, GSI_SAME_STMT);
|
||||||
|
|
||||||
/* Find maximum value from the vector of found indexes. */
|
/* Find maximum value from the vector of found indexes. */
|
||||||
tree max_index = make_ssa_name (index_scalar_type);
|
tree max_index = make_ssa_name (index_scalar_type);
|
||||||
@ -4880,7 +4890,7 @@ vect_create_epilog_for_reduction (stmt_vec_info stmt_info,
|
|||||||
|
|
||||||
/* Convert the reduced value back to the result type and set as the
|
/* Convert the reduced value back to the result type and set as the
|
||||||
result. */
|
result. */
|
||||||
gimple_seq stmts = NULL;
|
stmts = NULL;
|
||||||
new_temp = gimple_build (&stmts, VIEW_CONVERT_EXPR, scalar_type,
|
new_temp = gimple_build (&stmts, VIEW_CONVERT_EXPR, scalar_type,
|
||||||
data_reduc);
|
data_reduc);
|
||||||
gsi_insert_seq_before (&exit_gsi, stmts, GSI_SAME_STMT);
|
gsi_insert_seq_before (&exit_gsi, stmts, GSI_SAME_STMT);
|
||||||
|
Loading…
Reference in New Issue
Block a user