aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree.c
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2020-11-02 08:46:16 -0800
committerNathan Sidwell <nathan@acm.org>2020-11-02 08:56:39 -0800
commita0bc61e0b6da2ff9aca05d7b389a9c114a034052 (patch)
treea8d4e57246ce2bb6867e4155f7deff982f55b290 /gcc/tree.c
parent9a2e765d7773185efa109c12839ab6c8a18a1346 (diff)
downloadgcc-a0bc61e0b6da2ff9aca05d7b389a9c114a034052.zip
gcc-a0bc61e0b6da2ff9aca05d7b389a9c114a034052.tar.gz
gcc-a0bc61e0b6da2ff9aca05d7b389a9c114a034052.tar.bz2
core: Synchronize tree-cst & wide-int caching expectations
I fell over an ICE where wide_int_to_type_1's expectations of pointer value caching didn't match that of cache_integer_cst's behaviour. I don't know why it only exhibited on the modules branch, but it seems pretty wrong. This patch matches up the behaviours and adds a comment about that. gcc/ * tree.c (cache_integer_cst): Fixup pointer caching to match wide_int_to_type_1's expectations. Add comment.
Diffstat (limited to 'gcc/tree.c')
-rw-r--r--gcc/tree.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/gcc/tree.c b/gcc/tree.c
index 739c288..9260772 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -1737,6 +1737,8 @@ cache_integer_cst (tree t)
gcc_assert (!TREE_OVERFLOW (t));
+ /* The caching indices here must match those in
+ wide_int_to_type_1. */
switch (TREE_CODE (type))
{
case NULLPTR_TYPE:
@@ -1745,12 +1747,15 @@ cache_integer_cst (tree t)
case POINTER_TYPE:
case REFERENCE_TYPE:
- /* Cache NULL pointer. */
- if (integer_zerop (t))
- {
- limit = 1;
+ {
+ if (integer_zerop (t))
ix = 0;
- }
+ else if (integer_onep (t))
+ ix = 2;
+
+ if (ix >= 0)
+ limit = 3;
+ }
break;
case BOOLEAN_TYPE: