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.

        Jakub

Reply via email to