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/tree.c | |
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/tree.c')
-rw-r--r-- | gcc/tree.c | 48 |
1 files changed, 48 insertions, 0 deletions
@@ -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 |