re PR tree-optimization/68835 (ICE in set_value_range, at tree-vrp.c:387, with __int128 bit field)
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
This commit is contained in:
parent
4fae9c1012
commit
2833da1d2a
5 changed files with 56 additions and 6 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
12
gcc/testsuite/gcc.dg/pr68835-1.c
Normal file
12
gcc/testsuite/gcc.dg/pr68835-1.c
Normal file
|
@ -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;
|
||||
}
|
23
gcc/testsuite/gcc.dg/pr68835-2.c
Normal file
23
gcc/testsuite/gcc.dg/pr68835-2.c
Normal file
|
@ -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;
|
||||
}
|
11
gcc/tree.c
11
gcc/tree.c
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue