From: "H.J. Lu" <hjl.tools@gmail.com>
To: gcc-patches@gcc.gnu.org
Cc: Jakub Jelinek <jakub@redhat.com>, Richard Biener <rguenther@suse.de>
Subject: [PATCH] Use C++ RAII to clear currently_expanding_gimple_stmt
Date: Tue, 1 Mar 2022 08:55:23 -0800 [thread overview]
Message-ID: <20220301165523.869939-1-hjl.tools@gmail.com> (raw)
Use C++ RAII with make_temp_override in the C++ FE to automatically clear
currently_expanding_gimple_stmt.
gcc/
PR middle-end/104721
* cfgexpand.cc (expand_gimple_basic_block): Use make_temp_override
to clear currently_expanding_gimple_stmt automatically.
* tree.h (temp_override): Moved from cp/cp-tree.h.
(type_identity_t): Likewise.
make_temp_override(): Likewise.
gcc/cp/
PR middle-end/104721
* cp-tree.h (temp_override): Moved to ../tree.h.
(type_identity_t): Likewise.
make_temp_override(): Likewise.
---
gcc/cfgexpand.cc | 15 +++++---------
gcc/cp/cp-tree.h | 51 ------------------------------------------------
gcc/tree.h | 51 ++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 56 insertions(+), 61 deletions(-)
diff --git a/gcc/cfgexpand.cc b/gcc/cfgexpand.cc
index 87536ec7ccd..3d656113df5 100644
--- a/gcc/cfgexpand.cc
+++ b/gcc/cfgexpand.cc
@@ -5817,6 +5817,9 @@ expand_gimple_basic_block (basic_block bb, bool disable_tail_calls)
if (note)
NOTE_BASIC_BLOCK (note) = bb;
+ auto cleanup = make_temp_override (currently_expanding_gimple_stmt,
+ nullptr);
+
for (; !gsi_end_p (gsi); gsi_next (&gsi))
{
basic_block new_bb;
@@ -5927,10 +5930,7 @@ expand_gimple_basic_block (basic_block bb, bool disable_tail_calls)
{
new_bb = expand_gimple_cond (bb, as_a <gcond *> (stmt));
if (new_bb)
- {
- currently_expanding_gimple_stmt = NULL;
- return new_bb;
- }
+ return new_bb;
}
else if (is_gimple_debug (stmt))
{
@@ -6052,10 +6052,7 @@ expand_gimple_basic_block (basic_block bb, bool disable_tail_calls)
if (can_fallthru)
bb = new_bb;
else
- {
- currently_expanding_gimple_stmt = NULL;
- return new_bb;
- }
+ return new_bb;
}
}
else
@@ -6078,8 +6075,6 @@ expand_gimple_basic_block (basic_block bb, bool disable_tail_calls)
}
}
- currently_expanding_gimple_stmt = NULL;
-
/* Expand implicit goto and convert goto_locus. */
FOR_EACH_EDGE (e, ei, bb->succs)
{
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 80994e94793..0a55588dc5d 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -1961,57 +1961,6 @@ public:
}
};
-/* RAII sentinel that saves the value of a variable, optionally
- overrides it right away, and restores its value when the sentinel
- id destructed. */
-
-template <typename T>
-class temp_override
-{
- T& overridden_variable;
- T saved_value;
-public:
- temp_override(T& var) : overridden_variable (var), saved_value (var) {}
- temp_override(T& var, T overrider)
- : overridden_variable (var), saved_value (var)
- {
- overridden_variable = overrider;
- }
- ~temp_override() { overridden_variable = saved_value; }
-};
-
-/* Wrapping a template parameter in type_identity_t hides it from template
- argument deduction. */
-#if __cpp_lib_type_identity
-using std::type_identity_t;
-#else
-template <typename T>
-struct type_identity { typedef T type; };
-template <typename T>
-using type_identity_t = typename type_identity<T>::type;
-#endif
-
-/* Object generator function for temp_override, so you don't need to write the
- type of the object as a template argument.
-
- Use as auto x = make_temp_override (flag); */
-
-template <typename T>
-inline temp_override<T>
-make_temp_override (T& var)
-{
- return { var };
-}
-
-/* Likewise, but use as auto x = make_temp_override (flag, value); */
-
-template <typename T>
-inline temp_override<T>
-make_temp_override (T& var, type_identity_t<T> overrider)
-{
- return { var, overrider };
-}
-
/* The cached class binding level, from the most recently exited
class, or NULL if none. */
diff --git a/gcc/tree.h b/gcc/tree.h
index 36ceed57064..32d610474d2 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -6581,4 +6581,55 @@ extern tree get_attr_nonstring_decl (tree, tree * = NULL);
extern int get_target_clone_attr_len (tree);
+/* RAII sentinel that saves the value of a variable, optionally
+ overrides it right away, and restores its value when the sentinel
+ id destructed. */
+
+template <typename T>
+class temp_override
+{
+ T& overridden_variable;
+ T saved_value;
+public:
+ temp_override(T& var) : overridden_variable (var), saved_value (var) {}
+ temp_override(T& var, T overrider)
+ : overridden_variable (var), saved_value (var)
+ {
+ overridden_variable = overrider;
+ }
+ ~temp_override() { overridden_variable = saved_value; }
+};
+
+/* Wrapping a template parameter in type_identity_t hides it from template
+ argument deduction. */
+#if __cpp_lib_type_identity
+using std::type_identity_t;
+#else
+template <typename T>
+struct type_identity { typedef T type; };
+template <typename T>
+using type_identity_t = typename type_identity<T>::type;
+#endif
+
+/* Object generator function for temp_override, so you don't need to write the
+ type of the object as a template argument.
+
+ Use as auto x = make_temp_override (flag); */
+
+template <typename T>
+inline temp_override<T>
+make_temp_override (T& var)
+{
+ return { var };
+}
+
+/* Likewise, but use as auto x = make_temp_override (flag, value); */
+
+template <typename T>
+inline temp_override<T>
+make_temp_override (T& var, type_identity_t<T> overrider)
+{
+ return { var, overrider };
+}
+
#endif /* GCC_TREE_H */
--
2.35.1
next reply other threads:[~2022-03-01 16:55 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-01 16:55 H.J. Lu [this message]
2022-03-02 7:50 ` Richard Biener
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=20220301165523.869939-1-hjl.tools@gmail.com \
--to=hjl.tools@gmail.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=jakub@redhat.com \
--cc=rguenther@suse.de \
/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).