]> gcc.gnu.org Git - gcc.git/commitdiff
c++: simplify norm_cache manipulation
authorPatrick Palka <ppalka@redhat.com>
Fri, 19 May 2023 13:58:20 +0000 (09:58 -0400)
committerPatrick Palka <ppalka@redhat.com>
Fri, 19 May 2023 13:58:20 +0000 (09:58 -0400)
We can avoid performing two norm_cache lookups during normalization of a
concept-id by allocating and inserting a norm_entry* before rather than
after the fact, which is simpler and cheaper.

gcc/cp/ChangeLog:

* constraint.cc (normalize_concept_check): Avoid having to do
two norm_cache lookups.  Remove unnecessary early exit for an
ill-formed concept definition.

gcc/cp/constraint.cc

index c81e024e0e2cfad2339425d8ab65dd8cfacb433f..8cf0f2d097465aa6c0a49512da8cbcb789eae9de 100644 (file)
@@ -774,38 +774,25 @@ normalize_concept_check (tree check, tree args, norm_info info)
 
   if (!norm_cache)
     norm_cache = hash_table<norm_hasher>::create_ggc (31);
-  norm_entry entry = {tmpl, targs, NULL_TREE};
-  norm_entry **slot = nullptr;
-  hashval_t hash = 0;
-  bool insert = false;
+  norm_entry *entry = nullptr;
   if (!info.generate_diagnostics ())
     {
       /* Cache the normal form of the substituted concept-id (when not
         diagnosing).  */
-      hash = norm_hasher::hash (&entry);
-      slot = norm_cache->find_slot_with_hash (&entry, hash, NO_INSERT);
-      if (slot)
+      norm_entry elt = {tmpl, targs, NULL_TREE};
+      norm_entry **slot = norm_cache->find_slot (&elt, INSERT);
+      if (*slot)
        return (*slot)->norm;
-      insert = true;
+      entry = ggc_alloc<norm_entry> ();
+      *entry = elt;
+      *slot = entry;
     }
 
-  /* The concept may have been ill-formed.  */
   tree def = get_concept_definition (DECL_TEMPLATE_RESULT (tmpl));
-  if (def == error_mark_node)
-    return error_mark_node;
-
   info.update_context (check, args);
   tree norm = normalize_expression (def, targs, info);
-  if (insert)
-    {
-      /* Recompute SLOT since norm_cache may have been expanded during
-        the recursive call.  */
-      slot = norm_cache->find_slot_with_hash (&entry, hash, INSERT);
-      gcc_checking_assert (!*slot);
-      entry.norm = norm;
-      *slot = ggc_alloc<norm_entry> ();
-      **slot = entry;
-    }
+  if (entry)
+    entry->norm = norm;
   return norm;
 }
 
This page took 0.066422 seconds and 5 git commands to generate.