]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
fold-const.c (fold, [...]): Do not lose side effects when optimizing 0 % X.
authorJeff Law <law@redhat.com>
Tue, 1 Feb 2005 03:48:52 +0000 (20:48 -0700)
committerJeff Law <law@gcc.gnu.org>
Tue, 1 Feb 2005 03:48:52 +0000 (20:48 -0700)
* fold-const.c (fold, case CEIL_MOD_EXPR): Do not lose side
effects when optimizing 0 % X.  Do not try to optimize X % 0.

* gcc.c-torture/execute/20050131-1.c: New test.
* gcc.dg/wcaselabel.c: New test.

From-SVN: r94516

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/20050131-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/wcaselabel-1.c [new file with mode: 0644]

index 1b5174ead58f8d70409b2f7c3127aa3c541703e1..5320b6dffa6335c08d8c207dce62595df1a13585 100644 (file)
@@ -1,3 +1,8 @@
+2005-01-31  Jeff Law  <law@redhat.com>
+
+        * fold-const.c (fold, case CEIL_MOD_EXPR): Do not lose side
+        effects when optimizing 0 % X.  Do not try to optimize X % 0.
+
 2005-01-31  James E. Wilson  <wilson@specifixinc.com>
 
        * config/ia64/itanium1.md (1_scall bypass): Change 2_mmalua to
index 13c57e0ba6aea8a3be4e336fba0f93f9fae697c9..22857428a5c575c890ee705240db561a093d35eb 100644 (file)
@@ -7938,12 +7938,21 @@ fold (tree expr)
     case FLOOR_MOD_EXPR:
     case ROUND_MOD_EXPR:
     case TRUNC_MOD_EXPR:
-      /* 0 % X is always zero as is X % 1.  */
-      if (integer_zerop (arg0) || integer_onep (arg1))
+      /* X % 1 is always zero, but be sure to preserve any side
+        effects in X.  */
+      if (integer_onep (arg1))
        return omit_one_operand (type, integer_zero_node, arg0);
+
+      /* X % 0, return X % 0 unchanged so that we can get the
+        proper warnings and errors.  */
       if (integer_zerop (arg1))
        return t;
 
+      /* 0 % X is always zero, but be sure to preserve any side
+        effects in X.  Place this after checking for X == 0.  */
+      if (integer_zerop (arg0))
+       return omit_one_operand (type, integer_zero_node, arg1);
+
       /* X % -1 is zero.  */
       if (!TYPE_UNSIGNED (type)
          && TREE_CODE (arg1) == INTEGER_CST
index 4c7011ec9901bbefc882c7b2a234b93234f8c8d4..b697d41120d42236f283a76aebd3fa8410cee0d5 100644 (file)
@@ -1,3 +1,8 @@
+2005-01-31  Jeff Law  <law@redhat.com>
+
+       * gcc.c-torture/execute/20050131-1.c: New test.
+       * gcc.dg/wcaselabel.c: New test.
+
 2005-01-31  Mark Mitchell  <mark@codesourcery.com>
 
        * g++.dg/other/warning1.C: Adjust error messags.
diff --git a/gcc/testsuite/gcc.c-torture/execute/20050131-1.c b/gcc/testsuite/gcc.c-torture/execute/20050131-1.c
new file mode 100644 (file)
index 0000000..9fae911
--- /dev/null
@@ -0,0 +1,18 @@
+/* Verify that we do not lose side effects on a MOD expression.  */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+int
+foo (int a)
+{
+  int x = 0 % a++;
+  return a;
+}
+
+main()
+{
+  if (foo (9) != 10)
+    abort ();
+  exit (0);
+}
diff --git a/gcc/testsuite/gcc.dg/wcaselabel-1.c b/gcc/testsuite/gcc.dg/wcaselabel-1.c
new file mode 100644 (file)
index 0000000..6f673df
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-w" } */
+
+
+int foo(int x)
+{
+  switch(x)
+  {
+
+  case 0 % 0:   /* { dg-error "case label does not reduce to an integer constant" } */
+    return 1;
+  default:
+    return 2;
+  }
+}