diff options
author | Dmitry Plotnikov <dplotnikov@ispras.ru> | 2011-10-30 17:12:02 +0000 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2011-10-30 10:12:02 -0700 |
commit | 9db8f45d5d6cb5b6b66f241411f5a44cd72e3eac (patch) | |
tree | e44c3a45aa245b7294a083e14b64e2518eec620f /gcc/tree-vect-stmts.c | |
parent | 9814fdd6183efaa572a8cbd2a52e2abf30542413 (diff) | |
download | gcc-9db8f45d5d6cb5b6b66f241411f5a44cd72e3eac.tar.gz |
tree-cfg.c (verify_gimple_assign_unary): Allow vector conversions.
2011-10-30 Dmitry Plotnikov <dplotnikov@ispras.ru>
* tree-cfg.c (verify_gimple_assign_unary): Allow vector conversions.
* optabs.c (supportable_convert_operation): New function.
* optabs.h (supportable_convert_operation): New prototype.
* tree-vect-stmts.c (vectorizable_conversion): Change condition and
behavior for NONE modifier case.
* tree.h (VECTOR_INTEGER_TYPE_P): New macro.
From-SVN: r180684
Diffstat (limited to 'gcc/tree-vect-stmts.c')
-rw-r--r-- | gcc/tree-vect-stmts.c | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index dc81acb77e6..08abd23c0a1 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -1824,7 +1824,6 @@ vect_gen_widened_results_half (enum tree_code code, return new_stmt; } - /* Check if STMT performs a conversion operation, that can be vectorized. If VEC_STMT is also passed, vectorize the STMT: create a vectorized stmt to replace it, put it in VEC_STMT, and insert it at BSI. @@ -1853,7 +1852,6 @@ vectorizable_conversion (gimple stmt, gimple_stmt_iterator *gsi, tree vectype_out, vectype_in; int ncopies, j; tree rhs_type; - tree builtin_decl; enum { NARROW, NONE, WIDEN } modifier; int i; VEC(tree,heap) *vec_oprnds0 = NULL; @@ -1942,7 +1940,7 @@ vectorizable_conversion (gimple stmt, gimple_stmt_iterator *gsi, /* Supportable by target? */ if ((modifier == NONE - && !targetm.vectorize.builtin_conversion (code, vectype_out, vectype_in)) + && !supportable_convert_operation (code, vectype_out, vectype_in, &decl1, &code1)) || (modifier == WIDEN && !supportable_widening_operation (code, stmt, vectype_out, vectype_in, @@ -1992,19 +1990,28 @@ vectorizable_conversion (gimple stmt, gimple_stmt_iterator *gsi, else vect_get_vec_defs_for_stmt_copy (dt, &vec_oprnds0, NULL); - builtin_decl = - targetm.vectorize.builtin_conversion (code, - vectype_out, vectype_in); FOR_EACH_VEC_ELT (tree, vec_oprnds0, i, vop0) - { - /* Arguments are ready. create the new vector stmt. */ - new_stmt = gimple_build_call (builtin_decl, 1, vop0); - new_temp = make_ssa_name (vec_dest, new_stmt); - gimple_call_set_lhs (new_stmt, new_temp); - vect_finish_stmt_generation (stmt, new_stmt, gsi); - if (slp_node) - VEC_quick_push (gimple, SLP_TREE_VEC_STMTS (slp_node), new_stmt); - } + { + /* Arguments are ready, create the new vector stmt. */ + if (code1 == CALL_EXPR) + { + new_stmt = gimple_build_call (decl1, 1, vop0); + new_temp = make_ssa_name (vec_dest, new_stmt); + gimple_call_set_lhs (new_stmt, new_temp); + } + else + { + gcc_assert (TREE_CODE_LENGTH (code) == unary_op); + new_stmt = gimple_build_assign_with_ops (code, vec_dest, vop0, + NULL); + new_temp = make_ssa_name (vec_dest, new_stmt); + gimple_assign_set_lhs (new_stmt, new_temp); + } + + vect_finish_stmt_generation (stmt, new_stmt, gsi); + if (slp_node) + VEC_quick_push (gimple, SLP_TREE_VEC_STMTS (slp_node), new_stmt); + } if (j == 0) STMT_VINFO_VEC_STMT (stmt_info) = *vec_stmt = new_stmt; |