simplify-rtx.c (simplify_binary_operation): Check for overflow when folding integer...
authorDiego Novillo <dnovillo@redhat.com>
Thu, 5 Apr 2001 02:27:47 +0000 (02:27 +0000)
committerDiego Novillo <dnovillo@gcc.gnu.org>
Thu, 5 Apr 2001 02:27:47 +0000 (22:27 -0400)
2001-04-04  Diego Novillo  <dnovillo@redhat.com>

* simplify-rtx.c (simplify_binary_operation): Check for overflow
when folding integer division and modulo operations.

2001-04-04  Diego Novillo  <dnovillo@redhat.com>

* gcc.c-torture/compile/20010404-1.c: New test.

From-SVN: r41105

gcc/ChangeLog
gcc/simplify-rtx.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/20010404-1.c [new file with mode: 0644]

index e7444c98f67267ebf809c14e7522ecd7d582384a..cfc9306318e3d8cc576ab33fe8a355a186283052 100644 (file)
@@ -1,3 +1,8 @@
+2001-04-04  Diego Novillo  <dnovillo@redhat.com>
+
+       * simplify-rtx.c (simplify_binary_operation): Check for overflow
+       when folding integer division and modulo operations.
+
 2001-04-04  Andrew MacLeod  <amacleod@redhat.com>
 
        * dwarf2out.c (output_cfi): Add 'for_eh' parameter, use PTR_SIZE 
index dd7d2e1e6b5ef6d156acdee618cc653fda4f7f90..af8b708977c3fe014a9fe6dc71d3bb69b9dbb500 100644 (file)
@@ -1407,25 +1407,33 @@ simplify_binary_operation (code, mode, op0, op1)
       break;
 
     case DIV:
-      if (arg1s == 0)
+      if (arg1s == 0
+         || (arg0s == (HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1)
+             && arg1s == -1))
        return 0;
       val = arg0s / arg1s;
       break;
 
     case MOD:
-      if (arg1s == 0)
+      if (arg1s == 0
+         || (arg0s == (HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1)
+             && arg1s == -1))
        return 0;
       val = arg0s % arg1s;
       break;
 
     case UDIV:
-      if (arg1 == 0)
+      if (arg1 == 0
+         || (arg0s == (HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1)
+             && arg1s == -1))
        return 0;
       val = (unsigned HOST_WIDE_INT) arg0 / arg1;
       break;
 
     case UMOD:
-      if (arg1 == 0)
+      if (arg1 == 0
+         || (arg0s == (HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1)
+             && arg1s == -1))
        return 0;
       val = (unsigned HOST_WIDE_INT) arg0 % arg1;
       break;
index 225f9280257186a0b7f54a38d6cb947806470779..5e4c1552010e438bedef9c47b576babb5cca9f03 100644 (file)
@@ -1,3 +1,7 @@
+2001-04-04  Diego Novillo  <dnovillo@redhat.com>
+
+       * gcc.c-torture/compile/20010404-1.c: New test.
+
 2001-04-04  Jakub Jelinek  <jakub@redhat.com>
 
        * gcc.c-torture/compile/20010326-1.c: New test.
diff --git a/gcc/testsuite/gcc.c-torture/compile/20010404-1.c b/gcc/testsuite/gcc.c-torture/compile/20010404-1.c
new file mode 100644 (file)
index 0000000..f890118
--- /dev/null
@@ -0,0 +1,15 @@
+/* This testcase caused a floating point exception in the compiler when
+   compiled with -O2. The crash occurs when trying to simplify division
+   and modulo operations.  */
+
+#include <limits.h>
+
+extern void bar (int);
+
+void foo ()
+{
+  int a = INT_MIN;
+  int b = -1;
+  bar (a / b);
+  bar (a % b);
+}