tree-cfg.c (valid_fixed_convert_types_p): New function.
authorRichard Sandiford <rdsandiford@googlemail.com>
Sat, 10 May 2008 12:18:24 +0000 (12:18 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Sat, 10 May 2008 12:18:24 +0000 (12:18 +0000)
gcc/
* tree-cfg.c (valid_fixed_convert_types_p): New function.
(verify_gimple_expr): Handle FIXED_CONVERT_EXPR.

From-SVN: r135143

gcc/ChangeLog
gcc/tree-cfg.c

index b62535aa8329fa5db82f9f970bf595ea852a400e..a8695c0e39f60f8961f0687e1208105e8385e4e0 100644 (file)
@@ -1,3 +1,8 @@
+2008-05-10  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * tree-cfg.c (valid_fixed_convert_types_p): New function.
+       (verify_gimple_expr): Handle FIXED_CONVERT_EXPR.
+
 2008-05-10  Uros Bizjak  <ubizjak@gmail.com>
 
        * value-prof.c (interesting_stringop_to_profile): Do not
index 340c7a257ce806f362cfbe9a6badeb671b251f93..ed5282691dae084c3a8aeb65e4ddc7bf73a6ec58 100644 (file)
@@ -3598,6 +3598,18 @@ one_pointer_to_useless_type_conversion_p (tree dest, tree src_obj)
   return false;
 }
 
+/* Return true if TYPE1 is a fixed-point type and if conversions to and
+   from TYPE2 can be handled by FIXED_CONVERT_EXPR.  */
+
+static bool
+valid_fixed_convert_types_p (tree type1, tree type2)
+{
+  return (FIXED_POINT_TYPE_P (type1)
+         && (INTEGRAL_TYPE_P (type2)
+             || SCALAR_FLOAT_TYPE_P (type2)
+             || FIXED_POINT_TYPE_P (type2)));
+}
+
 /* Verify the GIMPLE expression EXPR.  Returns true if there is an
    error, otherwise false.  */
 
@@ -3654,6 +3666,27 @@ verify_gimple_expr (tree expr)
        return false;
       }
 
+    case FIXED_CONVERT_EXPR:
+      {
+       tree op = TREE_OPERAND (expr, 0);
+       if (!is_gimple_val (op))
+         {
+           error ("invalid operand in conversion");
+           return true;
+         }
+
+       if (!valid_fixed_convert_types_p (type, TREE_TYPE (op))
+           && !valid_fixed_convert_types_p (TREE_TYPE (op), type))
+         {
+           error ("invalid types in fixed-point conversion");
+           debug_generic_expr (type);
+           debug_generic_expr (TREE_TYPE (op));
+           return true;
+         }
+
+       return false;
+      }
+
     case FLOAT_EXPR:
       {
        tree op = TREE_OPERAND (expr, 0);