fold-const.c (fold): The transformation "X % -Y" -> "X % Y" is only valid for TRUNC_M...
authorRoger Sayle <roger@eyesopen.com>
Mon, 2 Aug 2004 17:11:42 +0000 (17:11 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Mon, 2 Aug 2004 17:11:42 +0000 (17:11 +0000)
* fold-const.c (fold) <TRUNC_MOD_EXPR>: The transformation "X % -Y"
-> "X % Y" is only valid for TRUNC_MOD_EXPR.

From-SVN: r85443

gcc/ChangeLog
gcc/fold-const.c

index 23750e3751a17fc856da6e2e9cac9832f89dc1b8..db525b47c708b246bcad7360a08555805eacf528 100644 (file)
@@ -1,3 +1,8 @@
+2004-08-02  Roger Sayle  <roger@eyesopen.com>
+
+       * fold-const.c (fold) <TRUNC_MOD_EXPR>: The transformation "X % -Y"
+       -> "X % Y" is only valid for TRUNC_MOD_EXPR.
+
 2004-08-02  Gabriel Dos Reis  <gdr@integrable-solutions.net>
 
        * vec.h (DEF_VEC_P): Add proper cast to uses of vec_o_reserve and
index 23f7576ff4ee5f73895cf39dd78bbc51f210cfd3..f4a6fb022d4710d9cbee82ace3b56b3f5dbe4811 100644 (file)
@@ -7624,8 +7624,9 @@ fold (tree expr)
                               fold_convert (type, arg0), mask));
        }
 
-      /* X % -C is the same as X % C (for all rounding moduli).  */
-      if (!TYPE_UNSIGNED (type)
+      /* X % -C is the same as X % C.  */
+      if (code == TRUNC_MOD_EXPR
+         && !TYPE_UNSIGNED (type)
          && TREE_CODE (arg1) == INTEGER_CST
          && TREE_INT_CST_HIGH (arg1) < 0
          && !flag_trapv
@@ -7634,8 +7635,9 @@ fold (tree expr)
        return fold (build2 (code, type, fold_convert (type, arg0),
                             fold_convert (type, negate_expr (arg1))));
 
-      /* X % -Y is the same as X % Y (for all rounding moduli).  */
-      if (!TYPE_UNSIGNED (type)
+      /* X % -Y is the same as X % Y.  */
+      if (code == TRUNC_MOD_EXPR
+         && !TYPE_UNSIGNED (type)
          && TREE_CODE (arg1) == NEGATE_EXPR
          && !flag_trapv)
        return fold (build2 (code, type, fold_convert (type, arg0),