diff options
author | irar <irar@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-10-21 13:36:56 +0000 |
---|---|---|
committer | irar <irar@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-10-21 13:36:56 +0000 |
commit | 09e31a48a894f848c041ecb59bba70084892cba9 (patch) | |
tree | 300d18c5421de122b062f8b293724c24ba1cf14b /gcc/tree-vect-loop.c | |
parent | 20e4f1c1b873e306a4eef23aa860f9c89a1d2b74 (diff) | |
download | gcc-09e31a48a894f848c041ecb59bba70084892cba9.tar.gz |
PR tree-optimization/46049
PR tree-optimization/46052
* tree-vectorizer.h (enum stmt_vec_info_type): Add new value for
shift.
(vect_get_slp_defs): Add arguments.
* tree-vect-loop.c (vect_create_epilog_for_reduction): Pass scalar
operands to vect_get_slp_defs.
(vectorizable_reduction): Fix comment, pass scalar operands to
vect_get_slp_defs.
* tree-vect-stmts.c (vect_get_vec_def_for_operand): Use operand's
type to determine number of units in the created vector.
(vect_get_vec_defs): Pass scalar operands to vect_get_slp_defs.
(vectorizable_conversion): Fix comment.
(vectorizable_shift): New function.
(vectorizable_operation): Move code that handles shifts to
vectorizable_shift.
(vectorizable_type_demotion): Fix comment, pass scalar operands to
vect_get_slp_defs.
(vectorizable_type_promotion, vectorizable_store): Likewise.
(vectorizable_condition): Fix comment.
(vect_analyze_stmt): Call vectorizable_shift.
(vect_transform_stmt): Likewise.
* tree-vect-slp.c (vect_get_constant_vectors): Add new argument.
Use it as the operand to create vectors for, except reduction
initial definition and store. Use operands type.
(vect_get_slp_defs): Add new arguments. Pass them to
vect_get_constant_vectors.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@165777 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-vect-loop.c')
-rw-r--r-- | gcc/tree-vect-loop.c | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index d7a864a0196..4b1bd443054 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -3193,7 +3193,8 @@ vect_create_epilog_for_reduction (VEC (tree, heap) *vect_defs, gimple stmt, /* Get the loop-entry arguments. */ if (slp_node) - vect_get_slp_defs (slp_node, &vec_initial_defs, NULL, reduc_index); + vect_get_slp_defs (reduction_op, NULL_TREE, slp_node, &vec_initial_defs, + NULL, reduc_index); else { vec_initial_defs = VEC_alloc (tree, heap, 1); @@ -3965,7 +3966,7 @@ vectorizable_reduction (gimple stmt, gimple_stmt_iterator *gsi, gcc_assert (is_gimple_assign (stmt)); - /* Flatten RHS */ + /* Flatten RHS. */ switch (get_gimple_rhs_class (gimple_assign_rhs_code (stmt))) { case GIMPLE_SINGLE_RHS: @@ -4332,8 +4333,20 @@ vectorizable_reduction (gimple stmt, gimple_stmt_iterator *gsi, /* Handle uses. */ if (j == 0) { + tree op0, op1 = NULL_TREE; + + op0 = ops[!reduc_index]; + if (op_type == ternary_op) + { + if (reduc_index == 0) + op1 = ops[2]; + else + op1 = ops[1]; + } + if (slp_node) - vect_get_slp_defs (slp_node, &vec_oprnds0, &vec_oprnds1, -1); + vect_get_slp_defs (op0, op1, slp_node, &vec_oprnds0, &vec_oprnds1, + -1); else { loop_vec_def0 = vect_get_vec_def_for_operand (ops[!reduc_index], @@ -4341,13 +4354,8 @@ vectorizable_reduction (gimple stmt, gimple_stmt_iterator *gsi, VEC_quick_push (tree, vec_oprnds0, loop_vec_def0); if (op_type == ternary_op) { - if (reduc_index == 0) - loop_vec_def1 = vect_get_vec_def_for_operand (ops[2], stmt, - NULL); - else - loop_vec_def1 = vect_get_vec_def_for_operand (ops[1], stmt, - NULL); - + loop_vec_def1 = vect_get_vec_def_for_operand (op1, stmt, + NULL); VEC_quick_push (tree, vec_oprnds1, loop_vec_def1); } } |