diff options
author | Marc Glisse <marc.glisse@inria.fr> | 2013-05-13 11:30:50 +0200 |
---|---|---|
committer | Marc Glisse <glisse@gcc.gnu.org> | 2013-05-13 09:30:50 +0000 |
commit | 640bfeb25ce9b2f645c75d1e04ecce9ad74c4be1 (patch) | |
tree | ed915c07d5e51d4f597a85fe3b3ee5781b72abfd /gcc | |
parent | 198fe1bfebf81e2a13b223bedcb41ed34d426862 (diff) | |
download | gcc-640bfeb25ce9b2f645c75d1e04ecce9ad74c4be1.zip gcc-640bfeb25ce9b2f645c75d1e04ecce9ad74c4be1.tar.gz gcc-640bfeb25ce9b2f645c75d1e04ecce9ad74c4be1.tar.bz2 |
tree-vect-generic.c (uniform_vector_p): Move ...
2013-05-13 Marc Glisse <marc.glisse@inria.fr>
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) <shift>: Turn the second argument
into a scalar.
gcc/testsuite/
* gcc.dg/vector-shift-2.c: New testcase.
From-SVN: r198819
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/fold-const.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vector-shift-2.c | 13 | ||||
-rw-r--r-- | gcc/tree-vect-generic.c | 46 | ||||
-rw-r--r-- | gcc/tree.c | 48 | ||||
-rw-r--r-- | gcc/tree.h | 5 |
7 files changed, 84 insertions, 46 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1f6e5c2..945f525 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2013-05-13 Marc Glisse <marc.glisse@inria.fr> + + * 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) <shift>: Turn the second argument + into a scalar. + 2013-05-13 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/57230 diff --git a/gcc/fold-const.c b/gcc/fold-const.c index bfe9e07..cbd3445 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 e465f2a..1e59972 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2013-05-13 Marc Glisse <marc.glisse@inria.fr> + + * gcc.dg/vector-shift-2.c: New testcase. + 2013-05-13 Jakub Jelinek <jakub@redhat.com> 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 0000000..2834290 --- /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 dbad6d9..516bd6f9 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,...}> @@ -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 @@ -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<tree, va_gc> *ctor_to_vec (tree); |