aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2023-11-01 23:21:34 -0400
committerJason Merrill <jason@redhat.com>2023-11-02 16:01:39 -0400
commit341c633bd8ce4e4a82038873606c6b32e94ae339 (patch)
treecc0b57149ce3a51c192f5c609f99ab4f5b409884 /gcc
parentae07265381d934ee97fb1ce8915731158c91babc (diff)
downloadgcc-341c633bd8ce4e4a82038873606c6b32e94ae339.zip
gcc-341c633bd8ce4e4a82038873606c6b32e94ae339.tar.gz
gcc-341c633bd8ce4e4a82038873606c6b32e94ae339.tar.bz2
c++: use hash_set in nrv_data
I noticed we were using a hash_table directly here instead of the simpler hash_set interface. Also, let's check for the variable itself and repeats earlier, since they should happen more often than any of the other cases. gcc/cp/ChangeLog: * semantics.cc (nrv_data): Change visited to hash_set. (finalize_nrv_r): Reorganize.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/semantics.cc26
1 files changed, 12 insertions, 14 deletions
diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc
index a0f2edc..37bffca 100644
--- a/gcc/cp/semantics.cc
+++ b/gcc/cp/semantics.cc
@@ -4980,7 +4980,7 @@ public:
tree var;
tree result;
- hash_table<nofree_ptr_hash <tree_node> > visited;
+ hash_set<tree> visited;
bool simple;
bool in_nrv_cleanup;
};
@@ -4991,12 +4991,22 @@ static tree
finalize_nrv_r (tree* tp, int* walk_subtrees, void* data)
{
class nrv_data *dp = (class nrv_data *)data;
- tree_node **slot;
/* No need to walk into types. There wouldn't be any need to walk into
non-statements, except that we have to consider STMT_EXPRs. */
if (TYPE_P (*tp))
*walk_subtrees = 0;
+
+ /* Replace all uses of the NRV with the RESULT_DECL. */
+ else if (*tp == dp->var)
+ *tp = dp->result;
+
+ /* Avoid walking into the same tree more than once. Unfortunately, we
+ can't just use walk_tree_without duplicates because it would only call
+ us for the first occurrence of dp->var in the function body. */
+ else if (dp->visited.add (*tp))
+ *walk_subtrees = 0;
+
/* If there's a label, we might need to destroy the NRV on goto (92407). */
else if (TREE_CODE (*tp) == LABEL_EXPR && !dp->in_nrv_cleanup)
dp->simple = false;
@@ -5086,18 +5096,6 @@ finalize_nrv_r (tree* tp, int* walk_subtrees, void* data)
SET_EXPR_LOCATION (init, EXPR_LOCATION (*tp));
*tp = init;
}
- /* And replace all uses of the NRV with the RESULT_DECL. */
- else if (*tp == dp->var)
- *tp = dp->result;
-
- /* Avoid walking into the same tree more than once. Unfortunately, we
- can't just use walk_tree_without duplicates because it would only call
- us for the first occurrence of dp->var in the function body. */
- slot = dp->visited.find_slot (*tp, INSERT);
- if (*slot)
- *walk_subtrees = 0;
- else
- *slot = *tp;
/* Keep iterating. */
return NULL_TREE;