diff options
author | Nathan Sidwell <nathan@acm.org> | 2020-11-02 08:46:16 -0800 |
---|---|---|
committer | Nathan Sidwell <nathan@acm.org> | 2020-11-02 08:56:39 -0800 |
commit | a0bc61e0b6da2ff9aca05d7b389a9c114a034052 (patch) | |
tree | a8d4e57246ce2bb6867e4155f7deff982f55b290 /gcc/tree.c | |
parent | 9a2e765d7773185efa109c12839ab6c8a18a1346 (diff) | |
download | gcc-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.c | 15 |
1 files changed, 10 insertions, 5 deletions
@@ -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: |