diff options
author | Dorit Nuzman <dorit@il.ibm.com> | 2007-11-04 03:48:58 +0000 |
---|---|---|
committer | Dorit Nuzman <dorit@gcc.gnu.org> | 2007-11-04 03:48:58 +0000 |
commit | a0aa00d709a52ac22a2dcdafb7cb90975f8aa17f (patch) | |
tree | 8c8b793827442ebc3f1186d3c822f3d4742194b6 /gcc/tree-vect-transform.c | |
parent | e45d5d63ea5c2b463f9eaf20b373ccef576f1afa (diff) | |
download | gcc-a0aa00d709a52ac22a2dcdafb7cb90975f8aa17f.zip gcc-a0aa00d709a52ac22a2dcdafb7cb90975f8aa17f.tar.gz gcc-a0aa00d709a52ac22a2dcdafb7cb90975f8aa17f.tar.bz2 |
re PR tree-optimization/33987 (internal compiler error: in get_initial_def_for_reduction, at tree-vect-transform.c:2110 with -O3 -msse2)
PR tree-optimization/33987
* tree-vect-transform.c (get_initial_def_for_reduction): Fix assert.
Fix indentation.
(vectorizable_reduction): Add type check.
From-SVN: r129880
Diffstat (limited to 'gcc/tree-vect-transform.c')
-rw-r--r-- | gcc/tree-vect-transform.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/gcc/tree-vect-transform.c b/gcc/tree-vect-transform.c index 4b88bdf..2cdc79b 100644 --- a/gcc/tree-vect-transform.c +++ b/gcc/tree-vect-transform.c @@ -2107,7 +2107,7 @@ get_initial_def_for_reduction (tree stmt, tree init_val, tree *adjustment_def) tree vector_type; bool nested_in_vect_loop = false; - gcc_assert (INTEGRAL_TYPE_P (type) || SCALAR_FLOAT_TYPE_P (type)); + gcc_assert (POINTER_TYPE_P (type) || INTEGRAL_TYPE_P (type) || SCALAR_FLOAT_TYPE_P (type)); if (nested_in_vect_loop_p (loop, stmt)) nested_in_vect_loop = true; else @@ -2120,17 +2120,17 @@ get_initial_def_for_reduction (tree stmt, tree init_val, tree *adjustment_def) case WIDEN_SUM_EXPR: case DOT_PROD_EXPR: case PLUS_EXPR: - if (nested_in_vect_loop) - *adjustment_def = vecdef; - else - *adjustment_def = init_val; - /* Create a vector of zeros for init_def. */ - if (INTEGRAL_TYPE_P (type)) - def_for_init = build_int_cst (type, 0); + if (nested_in_vect_loop) + *adjustment_def = vecdef; else + *adjustment_def = init_val; + /* Create a vector of zeros for init_def. */ + if (SCALAR_FLOAT_TYPE_P (type)) def_for_init = build_real (type, dconst0); - for (i = nunits - 1; i >= 0; --i) - t = tree_cons (NULL_TREE, def_for_init, t); + else + def_for_init = build_int_cst (type, 0); + for (i = nunits - 1; i >= 0; --i) + t = tree_cons (NULL_TREE, def_for_init, t); vector_type = get_vectype_for_scalar_type (TREE_TYPE (def_for_init)); gcc_assert (vector_type); init_def = build_vector (vector_type, t); @@ -2716,6 +2716,9 @@ vectorizable_reduction (tree stmt, block_stmt_iterator *bsi, tree *vec_stmt) return false; scalar_dest = GIMPLE_STMT_OPERAND (stmt, 0); scalar_type = TREE_TYPE (scalar_dest); + if (!POINTER_TYPE_P (scalar_type) && !INTEGRAL_TYPE_P (scalar_type) + && !SCALAR_FLOAT_TYPE_P (scalar_type)) + return false; /* All uses but the last are expected to be defined in the loop. The last use is the reduction variable. */ |