On Tue, 26 Jan 2021, Jakub Jelinek wrote:

> On Tue, Jan 26, 2021 at 10:03:16AM +0100, Richard Biener wrote:
> > > In 4.8 and earlier we used to fold the following to 0 during GENERIC 
> > > folding,
> > > but we don't do that anymore because ctor_for_folding etc. has been 
> > > turned into a
> > > GIMPLE centric API, but as the testcase shows, it is invoked even during
> > > GENERIC folding and there the automatic vars still should have meaningful
> > > initializers.  I've verified that the C++ FE drops TREE_READONLY on
> > > automatic vars with const qualified types if they require non-constant
> > > (runtime) initialization.
> 
> > > --- gcc/varpool.c.jj      2021-01-26 08:57:36.184290279 +0100
> > > +++ gcc/varpool.c 2021-01-26 09:46:16.453619140 +0100
> > > @@ -412,6 +412,12 @@ ctor_for_folding (tree decl)
> > >    if (!TREE_STATIC (decl) && !DECL_EXTERNAL (decl))
> > >      {
> > >        gcc_assert (!TREE_PUBLIC (decl));
> > > +      /* Unless this is called during FE folding.  */
> > > +      if (!in_gimple_form
> > 
> > Wouldn't it be better to use symtab->state == PARSING?  Why isn't
> 
> That would work for me too, in_gimple_form is just what is normally used
> for the folding.  And the routine is doing folding, but sits in a file where
> symtab->state == PARSING check is more natural.
> 
> > it safe to always return DECL_INITIAL (but demote NULL to
> > error_mark_node and/or change the gimplifier to set it to
> 
> I'm not sure if it is safe to look at DECL_INITIAL after gimplification for
> automatic vars because the gimplifier is destructive and could have changed
> the initializers in random ways.  But I admit I haven't investigated whether
> e.g. debug info cares about DECL_INITIAL for automatic vars or not.
> 
> Looking at gimplify_decl_expr I see there:
>       if (init && init != error_mark_node)
>         {
>           if (!TREE_STATIC (decl))
>             {
>               DECL_INITIAL (decl) = NULL_TREE;
>               init = build2 (INIT_EXPR, void_type_node, decl, init);
>               gimplify_and_add (init, seq_p);
>               ggc_free (init);
>             }
>           else
>             /* We must still examine initializers for static variables
>                as they may contain a label address.  */
>             walk_tree (&init, force_labels_r, NULL, NULL);
>         }
> so perhaps we are usually fine.
> gimplify_compound_literal_expr doesn't clear DECL_INITIAL when
> optimizing non-addressable complit decls though (though perhaps those
> decls shouldn't appear in the IL then).
> 
> > error_mark_node for autos) for TREE_READONLY && !TREE_SIDE_EFFECTS
> > decls (including autos)?  Thus, why key on is_gimple_form at all?
> 
> Perhaps it is not needed, I was just trying to be safe.  Because
> after gimplification it will generally not be useful anyway.

If it is an initializer from constants we gimplify to a series of
assigns it might be still useful.  OTOH, I'm not sure whether
a const auto is really readonly in C or if it is safe to assume
the stack part is writable and thus casting away the const and
writing to it is fine ...

I guess if you are targeting GCC 11 the safe variant is prefered,
so OK with the == PARSING check there.

Richard.

Reply via email to