]> gcc.gnu.org Git - gcc.git/commitdiff
(fold...
authorRichard Kenner <kenner@gcc.gnu.org>
Fri, 30 Jul 1993 23:07:52 +0000 (19:07 -0400)
committerRichard Kenner <kenner@gcc.gnu.org>
Fri, 30 Jul 1993 23:07:52 +0000 (19:07 -0400)
(fold, case NOP_EXPR): Delete a pair of conversions back to the
original type when intermediate type is at least as wide.

From-SVN: r5046

gcc/fold-const.c

index a88b6197efcebd7d7a77dc921a01ac30320a611f..e3eab5b276ea3e787a55267134424ab6e2c64124 100644 (file)
@@ -3342,6 +3342,22 @@ fold (expr)
     case CONVERT_EXPR:
     case FIX_TRUNC_EXPR:
       /* Other kinds of FIX are not handled properly by fold_convert.  */
+
+      /* In addition to the cases of two conversions in a row 
+        handled below, if we are converting something to its own
+        type via an object of identical or wider precision, neither
+        conversion is needed.  */
+      if ((TREE_CODE (TREE_OPERAND (t, 0)) == NOP_EXPR
+          || TREE_CODE (TREE_OPERAND (t, 0)) == CONVERT_EXPR)
+         && TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0)) == TREE_TYPE (t)
+         && ((INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 0)))
+              && INTEGRAL_TYPE_P (TREE_TYPE (t)))
+             || (FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 0)))
+                 && FLOAT_TYPE_P (TREE_TYPE (t))))
+         && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (t, 0)))
+             >= TYPE_PRECISION (TREE_TYPE (t))))
+       return TREE_OPERAND (TREE_OPERAND (t, 0), 0);
+
       /* Two conversions in a row are not needed unless:
         - the intermediate type is narrower than both initial and final, or
         - the intermediate type and innermost type differ in signedness,
This page took 0.07241 seconds and 5 git commands to generate.