aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-cfg.c
diff options
context:
space:
mode:
authorRichard Biener <rguenth@gcc.gnu.org>2017-09-13 08:09:31 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2017-09-13 08:09:31 +0000
commit5a41741f0c311c5d4bca85292116f67ec7a2a60f (patch)
treef039f40bcb575cd3c140da30d35323d5cc94edab /gcc/tree-cfg.c
parent663628e38dd16a29e074f472065b27a9c9a823d0 (diff)
downloadgcc-5a41741f0c311c5d4bca85292116f67ec7a2a60f.zip
gcc-5a41741f0c311c5d4bca85292116f67ec7a2a60f.tar.gz
gcc-5a41741f0c311c5d4bca85292116f67ec7a2a60f.tar.bz2
tree-cfg.c (verify_gimple_assign_binary): Add verification for WIDEN_SUM_EXPR...
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. From-SVN: r252061
Diffstat (limited to 'gcc/tree-cfg.c')
-rw-r--r--gcc/tree-cfg.c90
1 files changed, 88 insertions, 2 deletions
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index b601012..99d1f1e 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -4013,15 +4013,80 @@ verify_gimple_assign_binary (gassign *stmt)
|| (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 *stmt)
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;