re PR other/15526 (-ftrapv aborts on 0 * (-1))
authorFalk Hueffner <falk@debian.org>
Wed, 19 May 2004 23:43:20 +0000 (01:43 +0200)
committerFalk Hueffner <falk@gcc.gnu.org>
Wed, 19 May 2004 23:43:20 +0000 (01:43 +0200)
PR other/15526
* libgcc2.c (__mulvsi3): Fix overflow test.
* gcc.dg/ftrapv-1.c: New test case.

From-SVN: r82042

gcc/ChangeLog
gcc/libgcc2.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/ftrapv-1.c [new file with mode: 0644]

index 54e328a560eac8cd65ae336cc0a0200e40e74214..6cc921fc091dd645ed1245ed5b362bc37aa1a2d7 100644 (file)
@@ -1,3 +1,8 @@
+2004-05-20  Falk Hueffner  <falk@debian.org>
+
+       PR other/15526
+       * libgcc2.c (__mulvsi3): Fix overflow test.
+
 2004-05-19  Andrew Pinski  <pinskia@physics.uc.edu>
 
        PR c/14171
index 34171ad90023c432b4b4d49933b0811da4663cbc..8a953ea8b761b5a5b9411ff84b496c15a5ed49ea 100644 (file)
@@ -130,9 +130,7 @@ __mulvsi3 (Wtype a, Wtype b)
 {
   const DWtype w = (DWtype) a * (DWtype) b;
 
-  if (((a >= 0) == (b >= 0))
-      ? (UDWtype) w > (UDWtype) (((DWtype) 1 << (WORD_SIZE - 1)) - 1)
-      : (UDWtype) w < (UDWtype) ((DWtype) -1 << (WORD_SIZE - 1)))
+  if ((Wtype) (w >> WORD_SIZE) != (Wtype) w >> (WORD_SIZE - 1))
     abort ();
 
   return w;
index 92437ffdcc2484992149dc00223e35db19b1312f..c716a323162deb7c18cd359537d52b0ef1b37c62 100644 (file)
@@ -1,3 +1,8 @@
+2004-05-20  Falk Hueffner  <falk@debian.org>
+
+       PR other/15526
+       * gcc.dg/ftrapv-1.c: New test case.
+
 2004-05-18  Feng Wang  <fengwang@nudt.edu.cn>
 
        * gfortran.fortran-torture/execute/power.f90: Test constant integers.
diff --git a/gcc/testsuite/gcc.dg/ftrapv-1.c b/gcc/testsuite/gcc.dg/ftrapv-1.c
new file mode 100644 (file)
index 0000000..44eb176
--- /dev/null
@@ -0,0 +1,25 @@
+/* Copyright (C) 2004 Free Software Foundation.
+
+   PR other/15526
+   Verify correct overflow checking with -ftrapv.
+
+   Written by Falk Hueffner, 20th May 2004.  */
+
+/* { dg-do run } */
+/* { dg-options "-ftrapv" } */
+
+__attribute__((noinline)) int
+mulv(int a, int b)
+{
+  return a * b;
+}
+
+int
+main()
+{
+  mulv( 0,  0);
+  mulv( 0, -1);
+  mulv(-1,  0);
+  mulv(-1, -1);
+  return 0;
+}