On Mon, May 28, 2018 at 12:12:18PM +0200, Richard Biener wrote:
> > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
> 
> Apart from
> 
> --- gcc/tree-cfg.c.jj   2018-05-26 23:03:55.361873297 +0200
> +++ gcc/tree-cfg.c      2018-05-27 12:54:55.046197128 +0200
> @@ -3676,6 +3676,8 @@ verify_gimple_assign_unary (gassign *stm
>      case VEC_UNPACK_LO_EXPR:
>      case VEC_UNPACK_FLOAT_HI_EXPR:
>      case VEC_UNPACK_FLOAT_LO_EXPR:
> +    case VEC_UNPACK_FIX_TRUNC_HI_EXPR:
> +    case VEC_UNPACK_FIX_TRUNC_LO_EXPR:
>        /* FIXME.  */
>        return false;
>  
> 
> the middle-end changes look OK.  Can you please add verification
> for the new codes here?

So like this (incremental patch, as it affects also the other codes)?

The VECTOR_BOOLEAN_P stuff is there because apparently we use these codes on
vector booleans too where the element size is the same (for
VEC_UNPACK_{HI,LO}_EXPR only).

Also, not really sure how to verify sizes of the whole vectors or better
nunits in the world of poly-int vector sizes (but VEC_PACK_*EXPR doesn't
verify that either).

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

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

        * tree-cfg.c (verify_gimple_assign_unary): Add checking for
        VEC_UNPACK_*_EXPR.

--- gcc/tree-cfg.c.jj   2018-05-28 19:47:55.180685259 +0200
+++ gcc/tree-cfg.c      2018-05-29 10:05:55.213775216 +0200
@@ -3678,7 +3678,35 @@ 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))))
+       {
+         error ("type mismatch in vector unpack expression");
+         debug_generic_expr (lhs_type);
+         debug_generic_expr (rhs1_type);
+         return true;
+        }
+
       return false;
 
     case NEGATE_EXPR:


        Jakub

Reply via email to