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 <[email protected]>
+
+ * 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;
}