diff options
author | Jason Merrill <jason@redhat.com> | 2022-03-21 09:58:28 -0400 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2022-05-04 16:01:35 -0400 |
commit | c8df7208864d863f58da55d42ff82663059930b1 (patch) | |
tree | 89d3874ee2e725468abbc8b12735211a6e18189b | |
parent | c2e846b539bb932d7f68f7e6b3e401c361cc3bf3 (diff) | |
download | gcc-c8df7208864d863f58da55d42ff82663059930b1.zip gcc-c8df7208864d863f58da55d42ff82663059930b1.tar.gz gcc-c8df7208864d863f58da55d42ff82663059930b1.tar.bz2 |
c++: optimize reshape_init
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.
gcc/cp/ChangeLog:
* decl.cc (reshape_init): Shortcut already-reshaped init.
(reshape_init_class): Assert not getting one here.
-rw-r--r-- | gcc/cp/decl.cc | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc index c9110db..0fa758f 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)) |