aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vect-transform.c
diff options
context:
space:
mode:
authorDorit Nuzman <dorit@il.ibm.com>2007-11-04 03:48:58 +0000
committerDorit Nuzman <dorit@gcc.gnu.org>2007-11-04 03:48:58 +0000
commita0aa00d709a52ac22a2dcdafb7cb90975f8aa17f (patch)
tree8c8b793827442ebc3f1186d3c822f3d4742194b6 /gcc/tree-vect-transform.c
parente45d5d63ea5c2b463f9eaf20b373ccef576f1afa (diff)
downloadgcc-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.c23
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. */