re PR tree-optimization/68835 (ICE in set_value_range, at tree-vrp.c:387, with __int1...
authorJakub Jelinek <jakub@redhat.com>
Thu, 17 Dec 2015 13:52:25 +0000 (14:52 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 17 Dec 2015 13:52:25 +0000 (14:52 +0100)
PR tree-optimization/68835
* tree.c (get_int_cst_ext_nunits): Return
cst.get_precision () / HOST_BITS_PER_WIDE_INT + 1
for all unsigned wi::neg_p (cst) constants.
(build_new_int_cst): If cst.get_precision is not a multiple
of HOST_BITS_PER_WIDE_INT, zero extend -1 to the precision
% HOST_BITS_PER_WIDE_INT.

* gcc.dg/pr68835-1.c: New test.
* gcc.dg/pr68835-2.c: New test.

From-SVN: r231757

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr68835-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr68835-2.c [new file with mode: 0644]
gcc/tree.c

index 46cf0b0862c09cdf25a862d24cc6f2aef672762b..f836652c9afb2b1c7457d3a67ec4f6893cb10913 100644 (file)
@@ -1,3 +1,13 @@
+2015-12-17  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/68835
+       * tree.c (get_int_cst_ext_nunits): Return
+       cst.get_precision () / HOST_BITS_PER_WIDE_INT + 1
+       for all unsigned wi::neg_p (cst) constants.
+       (build_new_int_cst): If cst.get_precision is not a multiple
+       of HOST_BITS_PER_WIDE_INT, zero extend -1 to the precision
+       % HOST_BITS_PER_WIDE_INT.
+
 2015-12-17  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/68951
index 7386f6b055ce8672d0a41f422e663d59120c92d4..193f99244634226818438ef033a2f24bce873578 100644 (file)
@@ -1,3 +1,9 @@
+2015-12-17  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/68835
+       * gcc.dg/pr68835-1.c: New test.
+       * gcc.dg/pr68835-2.c: New test.
+
 2015-12-17  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/68951
diff --git a/gcc/testsuite/gcc.dg/pr68835-1.c b/gcc/testsuite/gcc.dg/pr68835-1.c
new file mode 100644 (file)
index 0000000..47aebe3
--- /dev/null
@@ -0,0 +1,12 @@
+/* PR tree-optimization/68835 */
+/* { dg-do compile { target int128 } } */
+/* { dg-options "-O2" } */
+
+unsigned __int128
+foo (unsigned long a, unsigned long b)
+{
+  unsigned __int128 x = (unsigned __int128) a * b;
+  struct { unsigned __int128 a : 96; } w;
+  w.a = x;
+  return w.a;
+}
diff --git a/gcc/testsuite/gcc.dg/pr68835-2.c b/gcc/testsuite/gcc.dg/pr68835-2.c
new file mode 100644 (file)
index 0000000..dd355b1
--- /dev/null
@@ -0,0 +1,23 @@
+/* PR tree-optimization/68835 */
+/* { dg-do run { target int128 } } */
+/* { dg-options "-O2" } */
+
+__attribute__((noinline, noclone)) unsigned __int128
+foo (void)
+{
+  unsigned __int128 x = (unsigned __int128) 0xffffffffffffffffULL;
+  struct { unsigned __int128 a : 65; } w;
+  w.a = x;
+  w.a += x;
+  return w.a;
+}
+
+int
+main ()
+{
+  unsigned __int128 x = foo ();
+  if ((unsigned long long) x != 0xfffffffffffffffeULL
+      || (unsigned long long) (x >> 64) != 1)
+    __builtin_abort ();
+  return 0;
+}
index 66c06c992f6b30fb6bf3b572ac8e72c1ce056626..2190cae847510f8a416a7451fe1a1e3d3e2be15f 100644 (file)
@@ -1245,11 +1245,9 @@ static unsigned int
 get_int_cst_ext_nunits (tree type, const wide_int &cst)
 {
   gcc_checking_assert (cst.get_precision () == TYPE_PRECISION (type));
-  /* We need an extra zero HWI if CST is an unsigned integer with its
-     upper bit set, and if CST occupies a whole number of HWIs.  */
-  if (TYPE_UNSIGNED (type)
-      && wi::neg_p (cst)
-      && (cst.get_precision () % HOST_BITS_PER_WIDE_INT) == 0)
+  /* We need extra HWIs if CST is an unsigned integer with its
+     upper bit set.  */
+  if (TYPE_UNSIGNED (type) && wi::neg_p (cst))
     return cst.get_precision () / HOST_BITS_PER_WIDE_INT + 1;
   return cst.get_len ();
 }
@@ -1266,7 +1264,8 @@ build_new_int_cst (tree type, const wide_int &cst)
   if (len < ext_len)
     {
       --ext_len;
-      TREE_INT_CST_ELT (nt, ext_len) = 0;
+      TREE_INT_CST_ELT (nt, ext_len)
+       = zext_hwi (-1, cst.get_precision () % HOST_BITS_PER_WIDE_INT);
       for (unsigned int i = len; i < ext_len; ++i)
        TREE_INT_CST_ELT (nt, i) = -1;
     }