From: Marc Glisse Date: Mon, 13 May 2013 09:30:50 +0000 (+0200) Subject: tree-vect-generic.c (uniform_vector_p): Move ... X-Git-Tag: releases/gcc-4.9.0~5935 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=640bfeb25ce9b2f645c75d1e04ecce9ad74c4be1;p=thirdparty%2Fgcc.git tree-vect-generic.c (uniform_vector_p): Move ... 2013-05-13 Marc Glisse gcc/ * tree-vect-generic.c (uniform_vector_p): Move ... * tree.c (uniform_vector_p): ... here. * tree.h (uniform_vector_p): Declare it. * fold-const.c (fold_binary_loc) : Turn the second argument into a scalar. gcc/testsuite/ * gcc.dg/vector-shift-2.c: New testcase. From-SVN: r198819 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1f6e5c2b6574..945f525ead0b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2013-05-13 Marc Glisse + + * tree-vect-generic.c (uniform_vector_p): Move ... + * tree.c (uniform_vector_p): ... here. + * tree.h (uniform_vector_p): Declare it. + * fold-const.c (fold_binary_loc) : Turn the second argument + into a scalar. + 2013-05-13 Jakub Jelinek PR tree-optimization/57230 diff --git a/gcc/fold-const.c b/gcc/fold-const.c index bfe9e07d9b2a..cbd34452cfa6 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -12409,6 +12409,12 @@ fold_binary_loc (location_t loc, if (integer_zerop (arg0)) return omit_one_operand_loc (loc, type, arg0, arg1); + /* Prefer vector1 << scalar to vector1 << vector2 + if vector2 is uniform. */ + if (VECTOR_TYPE_P (TREE_TYPE (arg1)) + && (tem = uniform_vector_p (arg1)) != NULL_TREE) + return fold_build2_loc (loc, code, type, op0, tem); + /* Since negative shift count is not well-defined, don't try to compute it in the compiler. */ if (TREE_CODE (arg1) == INTEGER_CST && tree_int_cst_sgn (arg1) < 0) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e465f2a4c866..1e59972c041a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2013-05-13 Marc Glisse + + * gcc.dg/vector-shift-2.c: New testcase. + 2013-05-13 Jakub Jelinek PR tree-optimization/57230 diff --git a/gcc/testsuite/gcc.dg/vector-shift-2.c b/gcc/testsuite/gcc.dg/vector-shift-2.c new file mode 100644 index 000000000000..283429099c92 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vector-shift-2.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-fdump-tree-ccp1" } */ + +typedef unsigned vec __attribute__ ((vector_size (16))); +void +f (vec *a) +{ + vec s = { 5, 5, 5, 5 }; + *a = *a << s; +} + +/* { dg-final { scan-tree-dump "<< 5" "ccp1" } } */ +/* { dg-final { cleanup-tree-dump "ccp1" } } */ diff --git a/gcc/tree-vect-generic.c b/gcc/tree-vect-generic.c index dbad6d97598d..516bd6f954c6 100644 --- a/gcc/tree-vect-generic.c +++ b/gcc/tree-vect-generic.c @@ -326,52 +326,6 @@ expand_vector_addition (gimple_stmt_iterator *gsi, a, b, code); } -/* Check if vector VEC consists of all the equal elements and - that the number of elements corresponds to the type of VEC. - The function returns first element of the vector - or NULL_TREE if the vector is not uniform. */ -static tree -uniform_vector_p (tree vec) -{ - tree first, t; - unsigned i; - - if (vec == NULL_TREE) - return NULL_TREE; - - if (TREE_CODE (vec) == VECTOR_CST) - { - first = VECTOR_CST_ELT (vec, 0); - for (i = 1; i < VECTOR_CST_NELTS (vec); ++i) - if (!operand_equal_p (first, VECTOR_CST_ELT (vec, i), 0)) - return NULL_TREE; - - return first; - } - - else if (TREE_CODE (vec) == CONSTRUCTOR) - { - first = error_mark_node; - - FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (vec), i, t) - { - if (i == 0) - { - first = t; - continue; - } - if (!operand_equal_p (first, t, 0)) - return NULL_TREE; - } - if (i != TYPE_VECTOR_SUBPARTS (TREE_TYPE (vec))) - return NULL_TREE; - - return first; - } - - return NULL_TREE; -} - /* Try to expand vector comparison expression OP0 CODE OP1 by querying optab if the following expression: VEC_COND_EXPR< OP0 CODE OP1, {-1,...}, {0,...}> diff --git a/gcc/tree.c b/gcc/tree.c index d93c6aeb75ad..d4e85e19ccd0 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -10133,6 +10133,54 @@ initializer_zerop (const_tree init) } } +/* Check if vector VEC consists of all the equal elements and + that the number of elements corresponds to the type of VEC. + The function returns first element of the vector + or NULL_TREE if the vector is not uniform. */ +tree +uniform_vector_p (const_tree vec) +{ + tree first, t; + unsigned i; + + if (vec == NULL_TREE) + return NULL_TREE; + + gcc_assert (VECTOR_TYPE_P (TREE_TYPE (vec))); + + if (TREE_CODE (vec) == VECTOR_CST) + { + first = VECTOR_CST_ELT (vec, 0); + for (i = 1; i < VECTOR_CST_NELTS (vec); ++i) + if (!operand_equal_p (first, VECTOR_CST_ELT (vec, i), 0)) + return NULL_TREE; + + return first; + } + + else if (TREE_CODE (vec) == CONSTRUCTOR) + { + first = error_mark_node; + + FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (vec), i, t) + { + if (i == 0) + { + first = t; + continue; + } + if (!operand_equal_p (first, t, 0)) + return NULL_TREE; + } + if (i != TYPE_VECTOR_SUBPARTS (TREE_TYPE (vec))) + return NULL_TREE; + + return first; + } + + return NULL_TREE; +} + /* Build an empty statement at location LOC. */ tree diff --git a/gcc/tree.h b/gcc/tree.h index a46d276b94a7..89c088c1a974 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -5291,6 +5291,11 @@ extern tree first_field (const_tree); extern bool initializer_zerop (const_tree); +/* Given a vector VEC, return its first element if all elements are + the same. Otherwise return NULL_TREE. */ + +extern tree uniform_vector_p (const_tree); + /* Given a CONSTRUCTOR CTOR, return the element values as a vector. */ extern vec *ctor_to_vec (tree);