diff mbox series

[pushed] c++: optimize reshape_init

Message ID 20220504200144.2678058-1-jason@redhat.com
State New
Headers show
Series [pushed] c++: optimize reshape_init | expand

Commit Message

Jason Merrill May 4, 2022, 8:01 p.m. UTC
If the index of a constructor_elt is a FIELD_DECL, the CONSTRUCTOR is
already reshaped, so we can save time and memory by returning immediately.

Tested x86_64-pc-linux-gnu, applying to trunk.

gcc/cp/ChangeLog:

	* decl.cc (reshape_init): Shortcut already-reshaped init.
	 (reshape_init_class): Assert not getting one here.
---
 gcc/cp/decl.cc | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)


base-commit: c2e846b539bb932d7f68f7e6b3e401c361cc3bf3
diff mbox series

Patch

diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc
index c9110db796a..0fa758ff214 100644
--- a/gcc/cp/decl.cc
+++ b/gcc/cp/decl.cc
@@ -6631,7 +6631,9 @@  reshape_init_class (tree type, reshape_iter *d, bool first_initializer_p,
 
 	  if (TREE_CODE (d->cur->index) == FIELD_DECL)
 	    {
-	      /* We already reshaped this.  */
+	      /* We already reshaped this; we should have returned early from
+		 reshape_init.  */
+	      gcc_checking_assert (false);
 	      if (field != d->cur->index)
 		{
 		  if (tree id = DECL_NAME (d->cur->index))
@@ -7068,6 +7070,10 @@  reshape_init (tree type, tree init, tsubst_flags_t complain)
   if (vec_safe_is_empty (v))
     return init;
 
+  if ((*v)[0].index && TREE_CODE ((*v)[0].index) == FIELD_DECL)
+    /* Already reshaped.  */
+    return init;
+
   /* Brace elision is not performed for a CONSTRUCTOR representing
      parenthesized aggregate initialization.  */
   if (CONSTRUCTOR_IS_PAREN_INIT (init))