From: Harald Anlauf <anlauf@gmx.de>
To: Mikael Morin <mikael@gcc.gnu.org>,
gcc-patches@gcc.gnu.org, fortran@gcc.gnu.org
Subject: Re: [PATCH] fortran: Remove redundant tree walk to delete element
Date: Fri, 8 Sep 2023 23:22:43 +0200 [thread overview]
Message-ID: <7538c30a-e595-41fc-be35-653a3371f95e@gmx.de> (raw)
In-Reply-To: <20230908100434.541577-1-mikael@gcc.gnu.org>
Am 08.09.23 um 12:04 schrieb Mikael Morin via Gcc-patches:
> Hello,
>
> this avoids some redundant work in the symbol deletion code, which is
> used a lot by the parser to cancel statements that fail to match in the
> end.
> I haven't tried to measure the performance effect, if any, on a pathological example;
> just passed the fortran testsuite on x86_64-pc-linux-gnu.
> OK for master?
This is OK.
Thanks,
Harald
> -- >8 --
>
> Remove preliminary walk of the symbol tree when we are about to remove an
> element. This preliminary walk was necessary because the deletion function
> updated the tree without reporting back to the caller the element it had
> removed. But knowing that element is necessary to free its memory, so one
> had to first get that element before it was removed from the tree.
>
> This change updates the main deletion function delete_treap and its public
> wrapper gfc_delete_bbt so that the removed element can be known by the
> caller. This makes the preliminary walk in gfc_delete_symtree redundant,
> permitting its removal.
>
> gcc/fortran/ChangeLog:
>
> * bbt.cc (delete_treap): Add argument REMOVED, set it to the removed
> element from the tree. Change NULL to nullptr.
> (gfc_delete_bbt): Return the removed element from the tree.
> * gfortran.h (gfc_delete_symtree): Remove prototype.
> (gfc_delete_bbt): Set return type to pointer.
> * symbol.cc (gfc_delete_symtree): Make static. Get the element to be
> freed from the result of gfc_delete_bbt. Remove the preliminary walk to
> get it.
> ---
> gcc/fortran/bbt.cc | 27 +++++++++++++++++++--------
> gcc/fortran/gfortran.h | 3 +--
> gcc/fortran/symbol.cc | 6 ++----
> 3 files changed, 22 insertions(+), 14 deletions(-)
>
> diff --git a/gcc/fortran/bbt.cc b/gcc/fortran/bbt.cc
> index 851e5e92c7b..2a032083c5c 100644
> --- a/gcc/fortran/bbt.cc
> +++ b/gcc/fortran/bbt.cc
> @@ -168,31 +168,42 @@ delete_root (gfc_bbt *t)
> Returns the new root node of the tree. */
>
> static gfc_bbt *
> -delete_treap (gfc_bbt *old, gfc_bbt *t, compare_fn compare)
> +delete_treap (gfc_bbt *old, gfc_bbt *t, compare_fn compare, gfc_bbt **removed)
> {
> int c;
>
> - if (t == NULL)
> - return NULL;
> + if (t == nullptr)
> + {
> + if (removed)
> + *removed = nullptr;
> + return nullptr;
> + }
>
> c = (*compare) (old, t);
>
> if (c < 0)
> - t->left = delete_treap (old, t->left, compare);
> + t->left = delete_treap (old, t->left, compare, removed);
> if (c > 0)
> - t->right = delete_treap (old, t->right, compare);
> + t->right = delete_treap (old, t->right, compare, removed);
> if (c == 0)
> - t = delete_root (t);
> + {
> + if (removed)
> + *removed = t;
> + t = delete_root (t);
> + }
>
> return t;
> }
>
>
> -void
> +void *
> gfc_delete_bbt (void *root, void *old, compare_fn compare)
> {
> gfc_bbt **t;
> + gfc_bbt *removed;
>
> t = (gfc_bbt **) root;
> - *t = delete_treap ((gfc_bbt *) old, *t, compare);
> + *t = delete_treap ((gfc_bbt *) old, *t, compare, &removed);
> +
> + return (void *) removed;
> }
> diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
> index b37c6bb9ad4..371f8743312 100644
> --- a/gcc/fortran/gfortran.h
> +++ b/gcc/fortran/gfortran.h
> @@ -3510,7 +3510,6 @@ bool gfc_reference_st_label (gfc_st_label *, gfc_sl_type);
> gfc_namespace *gfc_get_namespace (gfc_namespace *, int);
> gfc_symtree *gfc_new_symtree (gfc_symtree **, const char *);
> gfc_symtree *gfc_find_symtree (gfc_symtree *, const char *);
> -void gfc_delete_symtree (gfc_symtree **, const char *);
> gfc_symtree *gfc_get_unique_symtree (gfc_namespace *);
> gfc_user_op *gfc_get_uop (const char *);
> gfc_user_op *gfc_find_uop (const char *, gfc_namespace *);
> @@ -3911,7 +3910,7 @@ bool gfc_inline_intrinsic_function_p (gfc_expr *);
> /* bbt.cc */
> typedef int (*compare_fn) (void *, void *);
> void gfc_insert_bbt (void *, void *, compare_fn);
> -void gfc_delete_bbt (void *, void *, compare_fn);
> +void * gfc_delete_bbt (void *, void *, compare_fn);
>
> /* dump-parse-tree.cc */
> void gfc_dump_parse_tree (gfc_namespace *, FILE *);
> diff --git a/gcc/fortran/symbol.cc b/gcc/fortran/symbol.cc
> index aa3cdc98c86..2cba2ea0bed 100644
> --- a/gcc/fortran/symbol.cc
> +++ b/gcc/fortran/symbol.cc
> @@ -2948,7 +2948,7 @@ gfc_new_symtree (gfc_symtree **root, const char *name)
>
> /* Delete a symbol from the tree. Does not free the symbol itself! */
>
> -void
> +static void
> gfc_delete_symtree (gfc_symtree **root, const char *name)
> {
> gfc_symtree st, *st0;
> @@ -2963,10 +2963,8 @@ gfc_delete_symtree (gfc_symtree **root, const char *name)
> else
> p = name;
>
> - st0 = gfc_find_symtree (*root, p);
> -
> st.name = gfc_get_string ("%s", p);
> - gfc_delete_bbt (root, &st, compare_symtree);
> + st0 = (gfc_symtree *) gfc_delete_bbt (root, &st, compare_symtree);
>
> free (st0);
> }
next prev parent reply other threads:[~2023-09-08 21:22 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-08 10:04 Mikael Morin
2023-09-08 21:22 ` Harald Anlauf [this message]
2023-09-09 10:44 ` Mikael Morin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7538c30a-e595-41fc-be35-653a3371f95e@gmx.de \
--to=anlauf@gmx.de \
--cc=fortran@gcc.gnu.org \
--cc=gcc-patches@gcc.gnu.org \
--cc=mikael@gcc.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).