On Tue, May 29, 2018 at 11:15:51AM +0200, Richard Biener wrote:
> Looking at other examples the only thing we have is
> maybe_ne and friends on TYPE_VECTOR_SUBPARTS.  But I think the only
> thing missing is
> 
>  || (maybe_ne (TYPE_VECTOR_SUBPARTS (lhs_type),
>              2 * TYPE_VECTOR_SUBPARTS (rhs_type)))
> 
> that together with the mode size check should ensure same size
> vectors.

The other way around.  It would then be (and I've added similar tests for
VEC_PACK*):

2018-05-29  Jakub Jelinek  <ja...@redhat.com>

        * tree-cfg.c (verify_gimple_assign_unary): Add checking for
        VEC_UNPACK_*_EXPR.
        (verify_gimple_assign_binary): Check TYPE_VECTOR_SUBPARTS for
        VEC_PACK_*_EXPR.

--- gcc/tree-cfg.c.jj   2018-05-28 19:47:55.180685259 +0200
+++ gcc/tree-cfg.c      2018-05-29 11:27:14.521339290 +0200
@@ -3678,7 +3678,37 @@ verify_gimple_assign_unary (gassign *stm
     case VEC_UNPACK_FLOAT_LO_EXPR:
     case VEC_UNPACK_FIX_TRUNC_HI_EXPR:
     case VEC_UNPACK_FIX_TRUNC_LO_EXPR:
-      /* FIXME.  */
+      if (TREE_CODE (rhs1_type) != VECTOR_TYPE
+          || TREE_CODE (lhs_type) != VECTOR_TYPE
+          || (!INTEGRAL_TYPE_P (TREE_TYPE (lhs_type))
+             && !SCALAR_FLOAT_TYPE_P (TREE_TYPE (lhs_type)))
+          || (!INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
+             && !SCALAR_FLOAT_TYPE_P (TREE_TYPE (rhs1_type)))
+         || ((rhs_code == VEC_UNPACK_HI_EXPR
+              || rhs_code == VEC_UNPACK_LO_EXPR)
+             && (INTEGRAL_TYPE_P (TREE_TYPE (lhs_type))
+                 != INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))))
+         || ((rhs_code == VEC_UNPACK_FLOAT_HI_EXPR
+              || rhs_code == VEC_UNPACK_FLOAT_LO_EXPR)
+             && (INTEGRAL_TYPE_P (TREE_TYPE (lhs_type))
+                 || SCALAR_FLOAT_TYPE_P (TREE_TYPE (rhs1_type))))
+         || ((rhs_code == VEC_UNPACK_FIX_TRUNC_HI_EXPR
+              || rhs_code == VEC_UNPACK_FIX_TRUNC_LO_EXPR)
+             && (INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
+                 || SCALAR_FLOAT_TYPE_P (TREE_TYPE (lhs_type))))
+         || (maybe_ne (GET_MODE_SIZE (element_mode (lhs_type)),
+                       2 * GET_MODE_SIZE (element_mode (rhs1_type)))
+             && (!VECTOR_BOOLEAN_TYPE_P (lhs_type)
+                 || !VECTOR_BOOLEAN_TYPE_P (rhs1_type)))
+         || maybe_ne (2 * TYPE_VECTOR_SUBPARTS (lhs_type),
+                      TYPE_VECTOR_SUBPARTS (rhs1_type)))
+       {
+         error ("type mismatch in vector unpack expression");
+         debug_generic_expr (lhs_type);
+         debug_generic_expr (rhs1_type);
+         return true;
+        }
+
       return false;
 
     case NEGATE_EXPR:
@@ -3993,7 +4023,9 @@ verify_gimple_assign_binary (gassign *st
                     == INTEGRAL_TYPE_P (TREE_TYPE (lhs_type))))
            || !types_compatible_p (rhs1_type, rhs2_type)
            || maybe_ne (GET_MODE_SIZE (element_mode (rhs1_type)),
-                        2 * GET_MODE_SIZE (element_mode (lhs_type))))
+                        2 * GET_MODE_SIZE (element_mode (lhs_type)))
+           || maybe_ne (2 * TYPE_VECTOR_SUBPARTS (rhs1_type),
+                        TYPE_VECTOR_SUBPARTS (lhs_type)))
           {
             error ("type mismatch in vector pack expression");
             debug_generic_expr (lhs_type);
@@ -4012,7 +4044,9 @@ verify_gimple_assign_binary (gassign *st
          || !SCALAR_FLOAT_TYPE_P (TREE_TYPE (lhs_type))
          || !types_compatible_p (rhs1_type, rhs2_type)
          || maybe_ne (GET_MODE_SIZE (element_mode (rhs1_type)),
-                      2 * GET_MODE_SIZE (element_mode (lhs_type))))
+                      2 * GET_MODE_SIZE (element_mode (lhs_type)))
+         || maybe_ne (2 * TYPE_VECTOR_SUBPARTS (rhs1_type),
+                      TYPE_VECTOR_SUBPARTS (lhs_type)))
        {
          error ("type mismatch in vector pack expression");
          debug_generic_expr (lhs_type);


        Jakub

Reply via email to