* extend cache_integer_cst
@ 2020-11-17 21:27 Nathan Sidwell
0 siblings, 0 replies; only message in thread
From: Nathan Sidwell @ 2020-11-17 21:27 UTC (permalink / raw)
To: GCC Patches
[-- Attachment #1: Type: text/plain, Size: 641 bytes --]
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.
applying to trunk
--
Nathan Sidwell
[-- Attachment #2: 21a-int-cst.diff --]
[-- Type: text/x-patch, Size: 2702 bytes --]
diff --git i/gcc/tree.c w/gcc/tree.c
index 569a9b9317b..004385548c9 100644
--- i/gcc/tree.c
+++ w/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 i/gcc/tree.h w/gcc/tree.h
index bea3e16c091..20f66a02403 100644
--- i/gcc/tree.h
+++ w/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
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2020-11-17 21:28 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-11-17 21:27 extend cache_integer_cst Nathan Sidwell
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).