Re: [PATCH 8/9 v3] lto: Add toplevel simple assembly heuristics

2026-01-08 Thread Jan Hubicka
> > 
> > I would add a dump file which shows what asm statements made symbol to
> > go global for easier debugging later (I suppose eventually this may get
> > us surprises)
> > > +
> > > +   l = 0;
> > > + }
> > > +
> > > +   /* Prevent overflow.  */
> > > +   if (l >= ident_buffer_size)
> > > + {
> > > +   ident_buffer_size *= 2;
> > > +   ident = (char*) xrealloc (ident, ident_buffer_size);
> > 
> > Perhas auto_vec and safe_push would be more readable (and less
> > effecient) way to do this in this millenia?
> > Honza
> 
> Changes in v3:
> Applied the suggested changes.
> 
> ---
> 
> This new pass heuristically detects symbols referenced by toplevel
> assembly to prevent their optimization.
> 
> Heuristics is done by comparing identifiers in assembly to known
> symbols.
> 
> The pass is split into 2 passes, in LGEN and in WPA.
> There must be one pass for WPA to be able to reference any symbol.
> However in WPA there may be multiple symbols with the same name,
> so we handle those local symbols in LGEN.
> 
> gcc/ChangeLog:
> 
>   * asm-toplevel.cc (mark_fragile_ref_by_asm):
>   Add marked_local to handle symbol as local.
>   (ipa_asm_heuristics): New.
>   (class pass_ipa_asm): New.
>   (make_pass_ipa_asm_lgen): New.
>   (make_pass_ipa_asm_wpa): New.
>   * common.opt: New flto-toplevel-asm-heuristics.
>   * passes.def: New asm passes.
>   * timevar.def (TV_IPA_LTO_ASM): New.
>   * tree-pass.h (make_pass_ipa_asm_lgen): New.
>   (make_pass_ipa_asm_wpa): New.
> 
> gcc/testsuite/ChangeLog:
> 
>   * gcc.dg/lto/toplevel-simple-asm-1_0.c: New test.
>   * gcc.dg/lto/toplevel-simple-asm-1_1.c: New test.
>   * gcc.dg/lto/toplevel-simple-asm-2_0.c: New test.
>   * gcc.dg/lto/toplevel-simple-asm-2_1.c: New test.
OK,
Honza


Re: [PATCH 8/9 v3] lto: Add toplevel simple assembly heuristics

2025-12-25 Thread Sam James
WMichal Jires  writes:

>> 
>> I would add a dump file which shows what asm statements made symbol to
>> go global for easier debugging later (I suppose eventually this may get
>> us surprises)
>> > +
>> > +l = 0;
>> > +  }
>> > +
>> > +/* Prevent overflow.  */
>> > +if (l >= ident_buffer_size)
>> > +  {
>> > +ident_buffer_size *= 2;
>> > +ident = (char*) xrealloc (ident, ident_buffer_size);
>> 
>> Perhas auto_vec and safe_push would be more readable (and less
>> effecient) way to do this in this millenia?
>> Honza
>
> Changes in v3:
> Applied the suggested changes.
>

This testcase ICEs with v3 of the series (not checked exactly which
patch, I assume this one):

__asm("");
char main_argv;

$ gcc -flto x.ii
lto1: error: type variant has different ‘TREE_TYPE’
 
unit-size 
align:8 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 
0x7ff92e0173f0 precision:8 min  max 
>
QI size  unit-size 
align:8 warn_if_not_align:0 symtab:0 alias-set -1 structural-equality
domain 
unit-size 
align:64 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 
0x7ff92e017738 precision:64 min  max >
DI size  unit-size 
align:64 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 
0x7ff92e017738 precision:64 min  max >>
lto1: error: type variant’s ‘TREE_TYPE’
  constant 8>
unit-size  constant 1>
align:8 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 
0x7ff92e0173f0 precision:8 min  max 
>
lto1: error: type’s ‘TREE_TYPE’
  constant 8>
unit-size  constant 1>
align:8 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 
0x7ff92e0173f0 precision:8 min  max 
>
 
unit-size 
align:8 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 
0x7ff92e0173f0 precision:8 min  max 
>
QI size  unit-size 
align:8 warn_if_not_align:0 symtab:0 alias-set -1 structural-equality
domain 
unit-size 
align:64 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 
0x7ff92e017738 precision:64 min  max >
DI size  unit-size 
align:64 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 
0x7ff92e017738 precision:64 min  max >>

> ---
>
> This new pass heuristically detects symbols referenced by toplevel
> assembly to prevent their optimization.
>
> Heuristics is done by comparing identifiers in assembly to known
> symbols.
>
> The pass is split into 2 passes, in LGEN and in WPA.
> There must be one pass for WPA to be able to reference any symbol.
> However in WPA there may be multiple symbols with the same name,
> so we handle those local symbols in LGEN.
>
> gcc/ChangeLog:
>
>   * asm-toplevel.cc (mark_fragile_ref_by_asm):
>   Add marked_local to handle symbol as local.
>   (ipa_asm_heuristics): New.
>   (class pass_ipa_asm): New.
>   (make_pass_ipa_asm_lgen): New.
>   (make_pass_ipa_asm_wpa): New.
>   * common.opt: New flto-toplevel-asm-heuristics.
>   * passes.def: New asm passes.
>   * timevar.def (TV_IPA_LTO_ASM): New.
>   * tree-pass.h (make_pass_ipa_asm_lgen): New.
>   (make_pass_ipa_asm_wpa): New.
>
> gcc/testsuite/ChangeLog:
>
>   * gcc.dg/lto/toplevel-simple-asm-1_0.c: New test.
>   * gcc.dg/lto/toplevel-simple-asm-1_1.c: New test.
>   * gcc.dg/lto/toplevel-simple-asm-2_0.c: New test.
>   * gcc.dg/lto/toplevel-simple-asm-2_1.c: New test.
> ---
>  gcc/asm-toplevel.cc   | 145 +-
>  gcc/common.opt|   4 +
>  gcc/passes.def|   2 +
>  .../gcc.dg/lto/toplevel-simple-asm-1_0.c  |  19 +++
>  .../gcc.dg/lto/toplevel-simple-asm-1_1.c  |  12 ++
>  .../gcc.dg/lto/toplevel-simple-asm-2_0.c  |  10 ++
>  .../gcc.dg/lto/toplevel-simple-asm-2_1.c  |  12 ++
>  gcc/timevar.def   |   1 +
>  gcc/tree-pass.h   |   2 +
>  9 files changed, 205 insertions(+), 2 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.dg/lto/toplevel-simple-asm-1_0.c
>  create mode 100644 gcc/testsuite/gcc.dg/lto/toplevel-simple-asm-1_1.c
>  create mode 100644 gcc/testsuite/gcc.dg/lto/toplevel-simple-asm-2_0.c
>  create mode 100644 gcc/testsuite/gcc.dg/lto/toplevel-simple-asm-2_1.c
>
> diff --git a/gcc/asm-toplevel.cc b/gcc/asm-toplevel.cc
> index 576e4b3ba73..5ab5b668d50 100644
> --- a/gcc/asm-toplevel.cc
> +++ b/gcc/asm-toplevel.cc
> @@ -29,11 +29,11 @@ along with GCC; see the file COPYING3.  If not see
>  /* This symbol must be available and cannot be renamed.
> Marks the symbol and symbols that reference it.  */
>  static void
> -mark_fragile_ref_by_asm (symtab_node* node)
> +mark_fragile_ref_by_asm (symtab_node* node, bool maybe_local = false)
>  {
>node->ref_by_asm = true;
>/* Local symbols must remain in the same partition with their callers.  */
> -  if (!TREE_PUBLIC (node->decl))
> +  if (!TREE_PUBLIC (node->decl) || may