public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "jakub at gcc dot gnu.org" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug c++/102876] GCC fails to use constant initialization even when it knows the value to initialize
Date: Mon, 25 Oct 2021 09:55:49 +0000	[thread overview]
Message-ID: <bug-102876-4-CW62PB2Bdc@http.gcc.gnu.org/bugzilla/> (raw)
In-Reply-To: <bug-102876-4@http.gcc.gnu.org/bugzilla/>

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102876

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |hubicka at gcc dot gnu.org

--- Comment #8 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
(In reply to Jason Merrill from comment #6)
> It's not clear to me that this optimization should use the constexpr
> machinery; as I commented on bug 4131.  If optimization turns the
> initialization of a static variable into a simple matter of storing a
> constant value, it should go one step further and turn that constant value
> into a constant initializer.

I guess that would be possible, a targetted optimization pass for
__static_initialization_and_destruction_* and _GLOBAL__sub_I_* functions (or
just the latter).
It would need to be done after IPA and after various optimization passes
afterwards so that the functions can be optimized enough, on the other side
with some further optimization passes still to go, so that when we optimize
away all the stores something can cleanup the function and some further
optimization can kick in and kill empty _GLOBAL__sub_I_* functions altogether.
For each dynamically initialized var it would probably need to try to build
updated DECL_INITIAL CONSTRUCTOR (starting from the one the var has if any),
maybe punt whenever some particular leaf field is initialized multiple times,
certainly punt if initialized by non-constant, maybe punt if a union has more
than one field initialized, etc.
But I'm worried about larger TUs where not all dynamic initialization can be
optimized into constants.  E.g. if there remain any function calls where the
alias analysis could think they can read or modify the vars or their subobjects
etc., we'd need to punt.
Perhaps we could when generating these functions wrap the dynamic
initialization of each var by calls into some new IFN that would take address
of the variable and for alias analysis say it reads it but doesn't modify and
doesn't escape the address.  In C++ one can't read the var in other
initializers until it has been constructed, right?  So the opening IFN would
stand as the first stmt that may read or write the variable and similarly
everything after the closing IFN would be considered unrelated code to that.
Not sure if we can reliably detect that the variable was declared read-only and
isn't TREE_READONLY only because it has dynamic initialization (and that it is
safe to optimize it into a .rodata var).
And, probably it would be best if we could arrange for post-IPA to handle these
global initialization functions as early as possible so that we don't need to
give up because the vars were already emitted into assembly.

  parent reply	other threads:[~2021-10-25  9:55 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-21 11:48 [Bug c++/102876] New: " redbeard0531 at gmail dot com
2021-10-21 12:37 ` [Bug c++/102876] " redi at gcc dot gnu.org
2021-10-21 12:52 ` rguenth at gcc dot gnu.org
2021-10-21 13:43 ` redbeard0531 at gmail dot com
2021-10-21 14:50 ` ppalka at gcc dot gnu.org
2021-10-21 15:20 ` jakub at gcc dot gnu.org
2021-10-21 18:36 ` jason at gcc dot gnu.org
2021-10-21 19:32 ` jason at gcc dot gnu.org
2021-10-22 21:35 ` pinskia at gcc dot gnu.org
2021-10-25  9:55 ` jakub at gcc dot gnu.org [this message]
2021-10-25 21:19 ` jason at gcc dot gnu.org
2021-10-26  8:41 ` jakub at gcc dot gnu.org
2021-10-26  8:46 ` jakub at gcc dot gnu.org
2021-10-26 11:04 ` redbeard0531 at gmail dot com
2021-10-26 11:38 ` jakub at gcc dot gnu.org
2021-10-27 17:11 ` jakub at gcc dot gnu.org
2021-11-03 18:25 ` jakub at gcc dot gnu.org
2022-10-17 14:11 ` ppalka at gcc dot gnu.org

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=bug-102876-4-CW62PB2Bdc@http.gcc.gnu.org/bugzilla/ \
    --to=gcc-bugzilla@gcc.gnu.org \
    --cc=gcc-bugs@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).