On Tue, 29 May 2018, Jakub Jelinek wrote: > 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*):
Ah, of course... OK if it tests ok. Thanks, Richard. > 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 > > -- Richard Biener <rguent...@suse.de> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)