From: Jason Merrill Date: Thu, 2 Nov 2023 03:21:34 +0000 (-0400) Subject: c++: use hash_set in nrv_data X-Git-Tag: basepoints/gcc-15~5052 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=341c633bd8ce4e4a82038873606c6b32e94ae339;p=thirdparty%2Fgcc.git 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. --- diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc index a0f2edcf1173..37bffca8e550 100644 --- a/gcc/cp/semantics.cc +++ b/gcc/cp/semantics.cc @@ -4980,7 +4980,7 @@ public: tree var; tree result; - hash_table > visited; + hash_set 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;