aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2015-12-17 14:52:25 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2015-12-17 14:52:25 +0100
commit2833da1d2a52591aa76c867d00ea3f838f387736 (patch)
treeb72d48432f46da6493f758fd909b5dbd54dee777 /gcc/tree.c
parent4fae9c1012246c77d6167388ba85c1b6e96c084b (diff)
downloadgcc-2833da1d2a52591aa76c867d00ea3f838f387736.zip
gcc-2833da1d2a52591aa76c867d00ea3f838f387736.tar.gz
gcc-2833da1d2a52591aa76c867d00ea3f838f387736.tar.bz2
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
Diffstat (limited to 'gcc/tree.c')
-rw-r--r--gcc/tree.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/gcc/tree.c b/gcc/tree.c
index 66c06c9..2190cae 100644
--- a/gcc/tree.c
+++ b/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;
}