re PR tree-optimization/65170 (curve25519-donna-c64 miscompilation)
authorJakub Jelinek <jakub@redhat.com>
Tue, 24 Feb 2015 08:07:10 +0000 (09:07 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 24 Feb 2015 08:07:10 +0000 (09:07 +0100)
PR tree-optimization/65170
* wide-int.cc (wi::mul_internal): For the umul_ppmm optimization,
if val[1] < 0, clear also val[2] and return 3.

* gcc.c-torture/execute/pr65170.c: New test.
* gcc.dg/tree-ssa/vrp96.c: New test.

From-SVN: r220931

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr65170.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/vrp96.c [new file with mode: 0644]
gcc/wide-int.cc
libsanitizer/ChangeLog

index d039c0a40476137a957bde36afe6b2f32f46e272..4bbdfe39049030631c6585e67c6739e7f7a8eccc 100644 (file)
@@ -1,3 +1,9 @@
+2015-02-24  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/65170
+       * wide-int.cc (wi::mul_internal): For the umul_ppmm optimization,
+       if val[1] < 0, clear also val[2] and return 3.
+
 2015-02-24  Alan Modra  <amodra@gmail.com>
 
        PR target/65172
index 11f06fc6d2a6c85081e6f272c11c8290613e852c..daf3e185c89962ac7b68b5cda15de6fe58b4df56 100644 (file)
@@ -1,3 +1,9 @@
+2015-02-24  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/65170
+       * gcc.c-torture/execute/pr65170.c: New test.
+       * gcc.dg/tree-ssa/vrp96.c: New test.
+
 2015-02-24  Tom de Vries  <tom@codesourcery.com>
 
        * gfortran.dg/readwrite_unf_direct_eor_1.f90: Add missing close.
@@ -27,7 +33,7 @@
        registers have the right values.  Save register state into
        static data rather than on the stack.
 
-2015-02-20  Jakub Jelinek  <jakub@redhat.com>
+2015-02-23  Jakub Jelinek  <jakub@redhat.com>
 
        PR bootstrap/63888
        * c-c++-common/asan/pr63888.c: New test.
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr65170.c b/gcc/testsuite/gcc.c-torture/execute/pr65170.c
new file mode 100644 (file)
index 0000000..60c0052
--- /dev/null
@@ -0,0 +1,27 @@
+/* PR tree-optimization/65170 */
+
+#ifdef __SIZEOF_INT128__
+typedef unsigned __int128 V;
+typedef unsigned long long int H;
+#else
+typedef unsigned long long int V;
+typedef unsigned int H;
+#endif
+
+__attribute__((noinline, noclone)) void
+foo (V b, V c)
+{
+  V a;
+  b &= (H) -1;
+  c &= (H) -1;
+  a = b * c;
+  if (a != 1)
+    __builtin_abort ();
+}
+
+int
+main ()
+{
+  foo (1, 1);
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp96.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp96.c
new file mode 100644 (file)
index 0000000..e17e424
--- /dev/null
@@ -0,0 +1,53 @@
+/* PR tree-optimization/65170 */
+/* { dg-do compile { target int128 } } */
+/* { dg-options "-O2 -fdump-tree-vrp1" } */
+
+typedef unsigned __int128 T;
+extern void link_error (void);
+extern void required_check (void);
+
+T
+foo (T b, T c)
+{
+  T a;
+  b &= 0xffffffffffffffffULL;
+  c &= 0xffffffffffffffffULL;
+  if (b < 7 || c < 7)
+    return 0;
+  a = b * c;
+  if (a < 49 || a > (((T) 0xfffffffffffffffeULL << 64) | 1))
+    link_error ();
+  return a;
+}
+
+T
+bar (T b, T c)
+{
+  T a;
+  b &= 0xffffffffffffffffULL;
+  c &= 0xffffffffffffffffULL;
+  if (b < 7 || c < 7)
+    return 0;
+  a = b * c;
+  if (a == 49)
+    required_check ();
+  return a;
+}
+
+T
+baz (T b, T c)
+{
+  T a;
+  b &= 0xffffffffffffffffULL;
+  c &= 0xffffffffffffffffULL;
+  if (b < 7 || c < 7)
+    return 0;
+  a = b * c;
+  if (a == (((T) 0xfffffffffffffffeULL << 64) | 1))
+    required_check ();
+  return a;
+}
+
+/* { dg-final { scan-tree-dump-not "link_error" "vrp1" } } */
+/* { dg-final { scan-tree-dump-times "required_check" 2 "vrp1" } } */
+/* { dg-final { cleanup-tree-dump "vrp1" } } */
index 7662648c20ed1a4ea9a5536a0abf04bc13e6edf2..1a7fc1435d0ac80dfabd45f3ad0321b8b060d9e9 100644 (file)
@@ -1309,6 +1309,11 @@ wi::mul_internal (HOST_WIDE_INT *val, const HOST_WIDE_INT *op1val,
              return 1;
            }
          umul_ppmm (val[1], val[0], op1.ulow (), op2.ulow ());
+         if (val[1] < 0 && prec > HOST_BITS_PER_WIDE_INT * 2)
+           {
+             val[2] = 0;
+             return 3;
+           }
          return 1 + (val[1] != 0 || val[0] < 0);
        }
       /* Likewise if the output is a full single HWI, except that the
index b106907fa4671ef1ddecd043fb5d06a1876c25ef..14fd62644be4b7a65608ac96a54c1942065429b1 100644 (file)
@@ -1,4 +1,4 @@
-2015-02-20  Jakub Jelinek  <jakub@redhat.com>
+2015-02-23  Jakub Jelinek  <jakub@redhat.com>
 
        PR bootstrap/63888
        * asan/asan_globals.cc (RegisterGlobal): Disable detect_odr_violation