public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] Use C++ RAII to clear currently_expanding_gimple_stmt
@ 2022-03-01 16:55 H.J. Lu
  2022-03-02  7:50 ` Richard Biener
  0 siblings, 1 reply; 2+ messages in thread
From: H.J. Lu @ 2022-03-01 16:55 UTC (permalink / raw)
  To: gcc-patches; +Cc: Jakub Jelinek, Richard Biener

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


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2022-03-02  7:50 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-03-01 16:55 [PATCH] Use C++ RAII to clear currently_expanding_gimple_stmt H.J. Lu
2022-03-02  7:50 ` Richard Biener

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).