On Wed, Jul 14, 2021 at 7:10 AM Alexandre Oliva <ol...@adacore.com> wrote:
>
> On Jul 13, 2021, Richard Biener <richard.guent...@gmail.com> wrote:
>
> > Hmm, elsewhere in this function we're not anticipating future removal but
> > instead use ->global_info_ready which IIRC is when the unit was
> > initially analyzed.  So don't the other uses have the same issue?
>
> Possibly.
>
> The call to debug_hooks->late_global_decl in symtab::remove_unused_nodes
> is only for varpool nodes, and only variables have initializers that are
> expanded as if for non-debug uses, but the initializers *might*
> reference function symbols, and that might in turn lead to analogous
> codegen differences.  I don't have a testcase for that, but it might not
> be hard to come up with an analogous one.
>
> > Maybe reference_to_unused is the wrong tool here and we need a
> > reference_to_discardable or so?
>
> Yeah, back when we expanded debug info very late in compilation,
> reference_to_unused was good enough, but now that we process and discard
> stuff early, what we really need is some way to avoid issuing a hard
> reference to something that might end up not be referenced at all if it
> weren't for debug info.
>
> > In other places we manage to use symbolic DIE references later resolved
> > by note_variable_values, can we maybe do this unconditionally for the
> > initializers of removed decls somehow?
>
> That seems doable and desirable.  decContext.c doesn't generate location
> or const_value for neither mfctop nor mfcone, even after removing
> rtl_for_decl_location from add_location_or_const_value_attribute,
> despite lookup_decl_loc's finding a location expression.
>
> I'm afraid I can't really commit to pursuing this any further.
>
> I'd be glad if someone more familiar with this were to pick this up, but
> I haven't managed to come up with a testcase to trigger the problem
> without the patchset that I'm not ready to contribute.
>
> The kicker, in case someone wants to force it, is that at
> materialize_all_clones, the reference to mfctop in a constprop-ed
> decContextTestEndian gets substituted by its constant initializer,
> &mfcone, so mfctop becomes unreachable and goes through late_global_decl
> in remove_unreachable_nodes.  Eventually, ccp2 resolves the mfcone
> dereference to a constant, and no reason remains for mfcone to be
> output.  However, when outputting debug info, the expand_expr of
> mfctop's initializer will have already generated RTL for mfcone,
> committing it to be output, wehreas without debug info, mfcone is not
> output at all.
>
> What enables these transformations during IPA is the introduction of a
> wrapper for decContextTestEndian, moving its body to a clone that is
> materialized early, at the end of all_small_ipa_passes.  This clone,
> being a local function, seems to be what enables the substitution of the
> mfctop constant initializer.  I haven't found a way to cause such a
> difference without my pass, even getting a constprop (local) clone for
> the function, and preventing its inlining into an exported function.
>
> Hopefully this is enough information to enable the issue to be
> investigated.

Can you put the above (and maybe your patch) into a PR so it doesn't
get lost?

Thanks,
Richard.

>
> --
> Alexandre Oliva, happy hacker                https://FSFLA.org/blogs/lxo/
>    Free Software Activist                       GNU Toolchain Engineer
> Disinformation flourishes because many people care deeply about injustice
> but very few check the facts.  Ask me about <https://stallmansupport.org>

Reply via email to