From d3ae802402b03e5df0518f1b71e0eeeff99ada28 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Tue, 17 Nov 2020 13:23:32 -0800 Subject: [PATCH] extend cache_integer_cst This modules-related patch extends cache_integer_cst. Currently, when given a small cst, that cst is added to the type's small and /must not/ already be there. Large values are fine if they are already in the large cache. This adds a parameter to indicate small duplicates are ok, and it returns the cached value -- either what was already tehre, or the newly inserted const. gcc/ * tree.h (cache_integer_cst): Add defaulted might_duplicate parm. * tree.c (cache_integer_cst): Return the integer cst, add might_duplicate parm to permit finding a small duplicate. --- gcc/tree.c | 36 +++++++++++++++++++++++++++--------- gcc/tree.h | 2 +- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/gcc/tree.c b/gcc/tree.c index 569a9b9..0043855 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -1755,8 +1755,15 @@ wide_int_to_tree (tree type, const poly_wide_int_ref &value) return build_poly_int_cst (type, value); } -void -cache_integer_cst (tree t) +/* Insert INTEGER_CST T into a cache of integer constants. And return + the cached constant (which may or may not be T). If MIGHT_DUPLICATE + is false, and T falls into the type's 'smaller values' range, there + cannot be an existing entry. Otherwise, if MIGHT_DUPLICATE is true, + or the value is large, should an existing entry exist, it is + returned (rather than inserting T). */ + +tree +cache_integer_cst (tree t, bool might_duplicate ATTRIBUTE_UNUSED) { tree type = TREE_TYPE (t); int ix = -1; @@ -1770,7 +1777,7 @@ cache_integer_cst (tree t) switch (TREE_CODE (type)) { case NULLPTR_TYPE: - gcc_assert (integer_zerop (t)); + gcc_checking_assert (integer_zerop (t)); /* Fallthru. */ case POINTER_TYPE: @@ -1850,21 +1857,32 @@ cache_integer_cst (tree t) TYPE_CACHED_VALUES (type) = make_tree_vec (limit); } - gcc_assert (TREE_VEC_ELT (TYPE_CACHED_VALUES (type), ix) == NULL_TREE); - TREE_VEC_ELT (TYPE_CACHED_VALUES (type), ix) = t; + if (tree r = TREE_VEC_ELT (TYPE_CACHED_VALUES (type), ix)) + { + gcc_checking_assert (might_duplicate); + t = r; + } + else + TREE_VEC_ELT (TYPE_CACHED_VALUES (type), ix) = t; } else { /* Use the cache of larger shared ints. */ tree *slot = int_cst_hash_table->find_slot (t, INSERT); - /* If there is already an entry for the number verify it's the - same. */ - if (*slot) - gcc_assert (wi::to_wide (tree (*slot)) == wi::to_wide (t)); + if (tree r = *slot) + { + /* If there is already an entry for the number verify it's the + same value. */ + gcc_checking_assert (wi::to_wide (tree (r)) == wi::to_wide (t)); + /* And return the cached value. */ + t = r; + } else /* Otherwise insert this one into the hash table. */ *slot = t; } + + return t; } diff --git a/gcc/tree.h b/gcc/tree.h index bea3e16..20f66a0 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -5124,7 +5124,7 @@ extern const_tree strip_invariant_refs (const_tree); extern tree lhd_gcc_personality (void); extern void assign_assembler_name_if_needed (tree); extern bool warn_deprecated_use (tree, tree); -extern void cache_integer_cst (tree); +extern tree cache_integer_cst (tree, bool might_duplicate = false); extern const char *combined_fn_name (combined_fn); /* Compare and hash for any structure which begins with a canonical -- 2.7.4