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.

-- 
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