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: Tue, 26 Oct 2021 08:41:25 +0000	[thread overview]
Message-ID: <bug-102876-4-q6GxnOgc9r@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

--- Comment #10 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
(In reply to Jason Merrill from comment #9)
> (In reply to Jakub Jelinek from comment #8)
> > 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.
> 
> Would we?  If the variable isn't const, it's OK for later initializers to
> modify its value, I wouldn't think that would prevent us from turning its
> initializer into a constant value.

I'm talking about e.g.
extern int b;
int foo (int &);
int bar (int &);
int baz () { return 1; }
int qux () { return b = 2; }
int a = foo (b);
int b = baz ();
int c = bar (b);
int d = qux ();
Here, b is initialized to constant 1 and we could optimize it into
.data
b: .long 1
or so and similarly d can be optimized into
.data
d: .long 2, but after IPA we see something like:
  _3 = foo (&b);
  a = _3;
  b = 1;
  _4 = bar (&b);
  c = _4;
  b = 2;
  d = 2;
where the fact that foo can only remember b's address somewhere, but can't
really access it because it hasn't been constructed yet is not visible.
So we'd just punt at optimizing that, we don't know if b is read or written by
foo (and, note, it doesn't have to be just the case of explicitly being passed
address of some var, it can get the address through other means).
On the other side, we can't optimize b to b: .long 2, because bar can use the
variable and/or modify it, so by using 2 as static initializer bar would be
miscompiled.
By turning the above into:
  .INIT_START (&a);
  _3 = foo (&b);
  a = _3;
  .INIT_END (&a);
  .INIT_START (&b);
  b = 1;
  .INIT_END (&b);
  .INIT_START (&c);
  _4 = bar (&b);
  c = _4;
  .INIT_END (&c);
  .INIT_START (&d);
  b = 2;
  d = 2;
  .INIT_END (&d);
we can optimize it into:
  _3 = foo (&b);
  a = _3;
  _4 = bar (&b);
  c = _4;
  b = 2;
with DECL_INITIAL (b) = 1 and DECL_INITIAL (d) = 2.
Not showing here any aggregate initializations, there we'd need to reconstruct
the CONSTRUCTOR for DECL_INITIAL from often more than one store.

> This seems like a more general issue: after a variable declared const has
> completed its initialization, it can't be modified.  Would this be useful to
> mark, kind of like we use a clobber for end of life?

I guess we could, but for this optimization we need it not just for const vars,
but also non-const.  And it isn't clear to me for what exactly we'd use it.

> Can't you just look at the type?

Probably.

  parent reply	other threads:[~2021-10-26  8:41 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
2021-10-25 21:19 ` jason at gcc dot gnu.org
2021-10-26  8:41 ` jakub at gcc dot gnu.org [this message]
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-q6GxnOgc9r@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).