aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2019-09-27 08:21:37 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2019-09-27 08:21:37 +0000
commit18908a56e18f15f84a91a4529923dd0878b2294f (patch)
treeb2f92a73ab5a113db2ffc4d3ed440676e493d9bf
parent76bb5af63db66ccaee0f0ae59783eda972d0db83 (diff)
downloadgcc-18908a56e18f15f84a91a4529923dd0878b2294f.zip
gcc-18908a56e18f15f84a91a4529923dd0878b2294f.tar.gz
gcc-18908a56e18f15f84a91a4529923dd0878b2294f.tar.bz2
Fix reduc_index==1 handling for COND_REDUCTION (PR91909)
The then/else order of the VEC_COND_EXPRs created by vect_create_epilog_for_reduction meeds to line up with the main VEC_COND_EXPR. 2019-09-27 Richard Sandiford <richard.sandiford@arm.com> gcc/ PR tree-optimization/91909 * tree-vect-loop.c (vect_create_epilog_for_reduction): Take a reduc_index parameter. When handling COND_REDUCTION, make sure that the reduction phi operand is in the correct arm of the VEC_COND_EXPR. (vectorizable_reduction): Pass reduc_index to the above. From-SVN: r276175
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/tree-vect-loop.c22
2 files changed, 24 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 64cc0a9..fe6b333 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2019-09-27 Richard Sandiford <richard.sandiford@arm.com>
+
+ PR tree-optimization/91909
+ * tree-vect-loop.c (vect_create_epilog_for_reduction): Take a
+ reduc_index parameter. When handling COND_REDUCTION, make sure
+ that the reduction phi operand is in the correct arm of the
+ VEC_COND_EXPR.
+ (vectorizable_reduction): Pass reduc_index to the above.
+
2019-09-27 Yuliang Wang <yuliang.wang@arm.com>
* config/aarch64/aarch64-sve2.md (aarch64_sve2_sra<mode>):
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index 237d28b..f5df534 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -4235,6 +4235,8 @@ get_initial_defs_for_reduction (slp_tree slp_node,
INDUC_CODE is the code for epilog reduction if INTEGER_INDUC_COND_REDUCTION.
NEUTRAL_OP is the value given by neutral_op_for_slp_reduction; it is
null if this is not an SLP reduction
+ REDUC_INDEX says which rhs operand of the STMT_INFO is the reduction phi
+ (counting from 0)
This function:
1. Creates the reduction def-use cycles: sets the arguments for
@@ -4285,7 +4287,7 @@ vect_create_epilog_for_reduction (vec<tree> vect_defs,
bool double_reduc,
slp_tree slp_node,
slp_instance slp_node_instance,
- tree neutral_op)
+ tree neutral_op, int reduc_index)
{
tree induc_val = NULL_TREE;
stmt_vec_info prev_phi_info;
@@ -4469,11 +4471,17 @@ vect_create_epilog_for_reduction (vec<tree> vect_defs,
tree ccompare = unshare_expr (gimple_assign_rhs1 (vec_stmt));
/* Create a conditional, where the condition is taken from vec_stmt
- (CCOMPARE), then is the induction index (INDEX_BEFORE_INCR) and
- else is the phi (NEW_PHI_TREE). */
- tree index_cond_expr = build3 (VEC_COND_EXPR, cr_index_vector_type,
- ccompare, indx_before_incr,
- new_phi_tree);
+ (CCOMPARE). The then and else values mirror the main VEC_COND_EXPR:
+ the reduction phi corresponds to NEW_PHI_TREE and the new values
+ correspond to INDEX_BEFORE_INCR. */
+ gcc_assert (reduc_index >= 1);
+ tree index_cond_expr;
+ if (reduc_index == 2)
+ index_cond_expr = build3 (VEC_COND_EXPR, cr_index_vector_type,
+ ccompare, indx_before_incr, new_phi_tree);
+ else
+ index_cond_expr = build3 (VEC_COND_EXPR, cr_index_vector_type,
+ ccompare, new_phi_tree, indx_before_incr);
induction_index = make_ssa_name (cr_index_vector_type);
gimple *index_condition = gimple_build_assign (induction_index,
index_cond_expr);
@@ -7159,7 +7167,7 @@ vectorizable_reduction (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
vect_create_epilog_for_reduction (vect_defs, stmt_info, reduc_def_phi,
orig_code, epilog_copies, reduc_fn, phis,
double_reduc, slp_node, slp_node_instance,
- neutral_op);
+ neutral_op, reduc_index);
return true;
}