Commit 640bfeb2 by Marc Glisse Committed by Marc Glisse

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
parent 198fe1bf
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
......
......@@ -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)
......
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
......
/* { 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" } } */
......@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment