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;
 }

Reply via email to