]> gcc.gnu.org Git - gcc.git/commitdiff
(fold, case EQ_EXPR, LE_EXPR): If comparing results of signed MOD with
authorRichard Kenner <kenner@gcc.gnu.org>
Mon, 5 Jul 1993 21:55:06 +0000 (17:55 -0400)
committerRichard Kenner <kenner@gcc.gnu.org>
Mon, 5 Jul 1993 21:55:06 +0000 (17:55 -0400)
zero, use an unsigned MOD.

From-SVN: r4852

gcc/fold-const.c

index 60b5e999416f8c8a4abf36ac2b21f3674c867c17..d03ae53bc2844d3ca1a64cd0e2749c681c488d3a 100644 (file)
@@ -4163,6 +4163,25 @@ fold (expr)
                           arg1));
        }
 
+      /* If this is an NE or EQ comparison of zero against the result of a
+        signed MOD operation, make the MOD operation unsigned since it
+        is simpler and equivalent.  */
+      if ((code == NE_EXPR || code == EQ_EXPR)
+         && integer_zerop (arg1)
+         && ! TREE_UNSIGNED (TREE_TYPE (arg0))
+         && (TREE_CODE (arg0) == TRUNC_MOD_EXPR
+             || TREE_CODE (arg0) == CEIL_MOD_EXPR
+             || TREE_CODE (arg0) == FLOOR_MOD_EXPR
+             || TREE_CODE (arg0) == ROUND_MOD_EXPR))
+       {
+         tree newtype = unsigned_type (TREE_TYPE (arg0));
+         tree newmod = build (TREE_CODE (arg0), newtype,
+                              convert (newtype, TREE_OPERAND (arg0, 0)),
+                              convert (newtype, TREE_OPERAND (arg0, 1)));
+
+         return build (code, type, newmod, convert (newtype, arg1));
+       }
+
       /* If this is an NE comparison of zero with an AND of one, remove the
         comparison since the AND will give the correct value.  */
       if (code == NE_EXPR && integer_zerop (arg1)
This page took 0.070742 seconds and 5 git commands to generate.