extend cache_integer_cst
authorNathan Sidwell <nathan@acm.org>
Tue, 17 Nov 2020 21:23:32 +0000 (13:23 -0800)
committerNathan Sidwell <nathan@acm.org>
Tue, 17 Nov 2020 21:28:08 +0000 (13:28 -0800)
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
gcc/tree.h

index 569a9b9317bee17f0dacfda0eee2bdba63b3aae1..004385548c94bd854de828b5e9135f59ead371ff 100644 (file)
@@ -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;
 }
 
 
index bea3e16c0916dc121e215ab8b18d179d6cc69898..20f66a02403b98b5b0cb7873f610aea4f96d879e 100644 (file)
@@ -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