diff options
author | Richard Biener <rguenther@suse.de> | 2020-05-29 12:00:00 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2020-05-29 13:00:36 +0200 |
commit | c735929a2503a7d03ac4739bba5b25336bf954c3 (patch) | |
tree | 32a3c744207e5a93d1b9d156a2fb1caa6d2ff10c /gcc/tree-vect-loop.c | |
parent | ddf90b72d2a723decc487db6d3131846b9a618de (diff) | |
download | gcc-c735929a2503a7d03ac4739bba5b25336bf954c3.zip gcc-c735929a2503a7d03ac4739bba5b25336bf954c3.tar.gz gcc-c735929a2503a7d03ac4739bba5b25336bf954c3.tar.bz2 |
tree-optimization/95272 - add SLP_TREE_REPRESENTATIVE
This adds SLP_TREE_REPRESENTATIVE - a representative stmt-info that
is used by SLP analysis and code generation. This avoids the need
for the hack in vect_slp_rearrange_stmts which previously avoided
to re-arrange stmts that might not have been isomorphic because
of operand swapping. It also plays nice with future directions of SLP
and for the forseeable future is easier than replicating more and
more info in the SLP node as long as non-SLP is in-tree.
2020-05-29 Richard Biener <rguenther@suse.de>
PR tree-optimization/95272
* tree-vectorizer.h (_slp_tree::representative): Add.
(SLP_TREE_REPRESENTATIVE): Likewise.
* tree-vect-loop.c (vectorizable_reduction): Adjust SLP
node gathering.
(vectorizable_live_operation): Use the representative to
attach the reduction info to.
* tree-vect-slp.c (_slp_tree::_slp_tree): Initialize
SLP_TREE_REPRESENTATIVE.
(vect_create_new_slp_node): Likewise.
(slp_copy_subtree): Copy it.
(vect_slp_rearrange_stmts): Re-arrange even COND_EXPR stmts.
(vect_slp_analyze_node_operations_1): Pass the representative
to vect_analyze_stmt.
(vect_schedule_slp_instance): Pass the representative to
vect_transform_stmt.
* gcc.dg/vect/pr95272.c: New testcase.
Diffstat (limited to 'gcc/tree-vect-loop.c')
-rw-r--r-- | gcc/tree-vect-loop.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 4f94b4b..3c5c0ea 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -6192,9 +6192,9 @@ vectorizable_reduction (loop_vec_info loop_vinfo, { slp_for_stmt_info = slp_node_instance->root; /* And then there's reduction chain with a conversion ... */ - if (SLP_TREE_SCALAR_STMTS (slp_for_stmt_info)[0] != stmt_info) + if (SLP_TREE_REPRESENTATIVE (slp_for_stmt_info) != stmt_info) slp_for_stmt_info = SLP_TREE_CHILDREN (slp_for_stmt_info)[0]; - gcc_assert (SLP_TREE_SCALAR_STMTS (slp_for_stmt_info)[0] == stmt_info); + gcc_assert (SLP_TREE_REPRESENTATIVE (slp_for_stmt_info) == stmt_info); } slp_tree *slp_op = XALLOCAVEC (slp_tree, op_type); for (i = 0; i < op_type; i++) @@ -7952,6 +7952,10 @@ vectorizable_live_operation (loop_vec_info loop_vinfo, all involved stmts together. */ else if (slp_index != 0) return true; + else + /* For SLP reductions the meta-info is attached to + the representative. */ + stmt_info = SLP_TREE_REPRESENTATIVE (slp_node); } stmt_vec_info reduc_info = info_for_reduction (loop_vinfo, stmt_info); gcc_assert (reduc_info->is_reduc_info); |