The current uniform_vector_p() function only returns non-NULL when the vector is directly a uniform vector. For example, for the following gimple code:
vect_cst_.15_91 = {_9, _9, _9, _9, _9, _9, _9, _9}; The current implementation can only detect that {_9, _9, _9, _9, _9, _9, _9, _9} is a uniform vector, but fails to recognize vect_cst_.15_91 is also one. This simple patch searches through assignment chains to find more uniform vectors. thanks, Cong diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 45c1667..b42f8a9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-10-01 Cong Hou <co...@google.com> + + * tree.c: Improve the function uniform_vector_p() so that a + vector assigned with a uniform vector is also treated as a + uniform vector. + diff --git a/gcc/tree.c b/gcc/tree.c index 1c881e4..1d6d894 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -10297,6 +10297,17 @@ uniform_vector_p (const_tree vec) return first; } + if (TREE_CODE (vec) == SSA_NAME) + { + gimple def = SSA_NAME_DEF_STMT (vec); + if (gimple_code (def) == GIMPLE_ASSIGN) + { + tree rhs = gimple_op (def, 1); + if (VECTOR_TYPE_P (TREE_TYPE (rhs))) + return uniform_vector_p (rhs); + } + } + return NULL_TREE; }