Message ID | 20230518180114.4158415-1-ppalka@redhat.com |
---|---|
State | New |
Headers | show |
Series | c++: simplify norm_cache manipulation | expand |
On 5/18/23 14:01, Patrick Palka wrote: > Avoid performing two norm_cache lookups during normalization of a > concept-id by allocating inserting a norm_entry* before rather than > after the fact, which is simpler and faster. > > Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for > trunk? OK. > 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 | 31 +++++++++---------------------- > 1 file changed, 9 insertions(+), 22 deletions(-) > > diff --git a/gcc/cp/constraint.cc b/gcc/cp/constraint.cc > index c81e024e0e2..8cf0f2d0974 100644 > --- a/gcc/cp/constraint.cc > +++ b/gcc/cp/constraint.cc > @@ -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; > } >
diff --git a/gcc/cp/constraint.cc b/gcc/cp/constraint.cc index c81e024e0e2..8cf0f2d0974 100644 --- a/gcc/cp/constraint.cc +++ b/gcc/cp/constraint.cc @@ -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; }