This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Add GIMPLE verification for a few codes
- From: Richard Biener <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Wed, 13 Sep 2017 10:08:28 +0200 (CEST)
- Subject: [PATCH] Add GIMPLE verification for a few codes
- Authentication-results: sourceware.org; auth=none
This fills in some gaps in GIMPLE verification. It shows that
for AVX vector boolean we use VEC_PACK_TRUNC_EXPR to essentially
concat two vectors -- I think we shouldn't have done that but
instead used { x, y } for this. But even the target got patterns
for this so I let this bypass verification for now.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.
2017-09-13 Richard Biener <rguenther@suse.de>
* tree-cfg.c (verify_gimple_assign_binary): Add verification
for WIDEN_SUM_EXPR, VEC_WIDEN_MULT_{HI,LO,EVEN,ODD}_EXPR,
VEC_PACK_{TRUNC,SAT,FIX_TRUNC}_EXPR.
(verify_gimple_assign_ternary): Add verification for DOT_PROD_EXPR.
Index: gcc/tree-cfg.c
===================================================================
--- gcc/tree-cfg.c (revision 252006)
+++ gcc/tree-cfg.c (working copy)
@@ -4013,15 +4013,80 @@ verify_gimple_assign_binary (gassign *st
|| (TYPE_PRECISION (rhs1_type) != TYPE_PRECISION (rhs2_type)));
case WIDEN_SUM_EXPR:
+ {
+ if (((TREE_CODE (rhs1_type) != VECTOR_TYPE
+ || TREE_CODE (lhs_type) != VECTOR_TYPE)
+ && ((!INTEGRAL_TYPE_P (rhs1_type)
+ && !SCALAR_FLOAT_TYPE_P (rhs1_type))
+ || (!INTEGRAL_TYPE_P (lhs_type)
+ && !SCALAR_FLOAT_TYPE_P (lhs_type))))
+ || !useless_type_conversion_p (lhs_type, rhs2_type)
+ || (GET_MODE_SIZE (element_mode (rhs2_type))
+ < 2 * GET_MODE_SIZE (element_mode (rhs1_type))))
+ {
+ error ("type mismatch in widening sum reduction");
+ debug_generic_expr (lhs_type);
+ debug_generic_expr (rhs1_type);
+ debug_generic_expr (rhs2_type);
+ return true;
+ }
+ return false;
+ }
+
case VEC_WIDEN_MULT_HI_EXPR:
case VEC_WIDEN_MULT_LO_EXPR:
case VEC_WIDEN_MULT_EVEN_EXPR:
case VEC_WIDEN_MULT_ODD_EXPR:
+ {
+ if (TREE_CODE (rhs1_type) != VECTOR_TYPE
+ || TREE_CODE (lhs_type) != VECTOR_TYPE
+ || !types_compatible_p (rhs1_type, rhs2_type)
+ || (GET_MODE_SIZE (element_mode (lhs_type))
+ != 2 * GET_MODE_SIZE (element_mode (rhs1_type))))
+ {
+ error ("type mismatch in vector widening multiplication");
+ debug_generic_expr (lhs_type);
+ debug_generic_expr (rhs1_type);
+ debug_generic_expr (rhs2_type);
+ return true;
+ }
+ return false;
+ }
+
case VEC_PACK_TRUNC_EXPR:
+ /* ??? We currently use VEC_PACK_TRUNC_EXPR to simply concat
+ vector boolean types. */
+ if (VECTOR_BOOLEAN_TYPE_P (lhs_type)
+ && VECTOR_BOOLEAN_TYPE_P (rhs1_type)
+ && types_compatible_p (rhs1_type, rhs2_type)
+ && (TYPE_VECTOR_SUBPARTS (lhs_type)
+ == 2 * TYPE_VECTOR_SUBPARTS (rhs1_type)))
+ return false;
+
+ /* Fallthru. */
case VEC_PACK_SAT_EXPR:
case VEC_PACK_FIX_TRUNC_EXPR:
- /* FIXME. */
- return false;
+ {
+ if (TREE_CODE (rhs1_type) != VECTOR_TYPE
+ || TREE_CODE (lhs_type) != VECTOR_TYPE
+ || !((rhs_code == VEC_PACK_FIX_TRUNC_EXPR
+ && SCALAR_FLOAT_TYPE_P (TREE_TYPE (rhs1_type))
+ && INTEGRAL_TYPE_P (TREE_TYPE (lhs_type)))
+ || (INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
+ == INTEGRAL_TYPE_P (TREE_TYPE (lhs_type))))
+ || !types_compatible_p (rhs1_type, rhs2_type)
+ || (GET_MODE_SIZE (element_mode (rhs1_type))
+ != 2 * GET_MODE_SIZE (element_mode (lhs_type))))
+ {
+ error ("type mismatch in vector pack expression");
+ debug_generic_expr (lhs_type);
+ debug_generic_expr (rhs1_type);
+ debug_generic_expr (rhs2_type);
+ return true;
+ }
+
+ return false;
+ }
case MULT_EXPR:
case MULT_HIGHPART_EXPR:
@@ -4281,6 +4346,27 @@ verify_gimple_assign_ternary (gassign *s
return false;
case DOT_PROD_EXPR:
+ {
+ if (((TREE_CODE (rhs1_type) != VECTOR_TYPE
+ || TREE_CODE (lhs_type) != VECTOR_TYPE)
+ && ((!INTEGRAL_TYPE_P (rhs1_type)
+ && !SCALAR_FLOAT_TYPE_P (rhs1_type))
+ || (!INTEGRAL_TYPE_P (lhs_type)
+ && !SCALAR_FLOAT_TYPE_P (lhs_type))))
+ || !types_compatible_p (rhs1_type, rhs2_type)
+ || !useless_type_conversion_p (lhs_type, rhs3_type)
+ || (GET_MODE_SIZE (element_mode (rhs3_type))
+ < 2 * GET_MODE_SIZE (element_mode (rhs1_type))))
+ {
+ error ("type mismatch in dot product reduction");
+ debug_generic_expr (lhs_type);
+ debug_generic_expr (rhs1_type);
+ debug_generic_expr (rhs2_type);
+ return true;
+ }
+ return false;
+ }
+
case REALIGN_LOAD_EXPR:
/* FIXME. */
return false;