On Sun, Nov 17, 2024 at 1:52 PM Jan Hubicka <hubi...@ucw.cz> wrote:
>
> >
> >
> > > Am 17.11.2024 um 09:54 schrieb Andrew Pinski <pins...@gmail.com>:
> > >
> > > On Sat, Nov 16, 2024 at 9:27 AM haochen.jiang <haoch...@smtp.intel.com> 
> > > wrote:
> > >>
> > >> On Linux/x86_64,
> > >>
> > >> cee7d080d5c2a5fb8125878998b742c040ec88b4 is the first bad commit
> > >> commit cee7d080d5c2a5fb8125878998b742c040ec88b4
> > >> Author: Jan Hubicka <hubi...@ucw.cz>
> > >> Date:   Sat Nov 16 14:04:32 2024 +0100
> > >>
> > >>    Ignore conditions guarding __builtin_unreachable in inliner metrics
> > >>
> > >> caused
> > >>
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2  -DPREVENT_OPTIMIZATION  line 16 
> > >> arg1 == 1
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2  -DPREVENT_OPTIMIZATION  line 16 
> > >> arg2 == 2
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2  -DPREVENT_OPTIMIZATION  line 16 
> > >> arg3 == 3
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2  -DPREVENT_OPTIMIZATION  line 16 
> > >> arg4 == 4
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2  -DPREVENT_OPTIMIZATION  line 16 
> > >> arg5 == 5
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2  -DPREVENT_OPTIMIZATION  line 16 
> > >> arg6 == 6
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2  -DPREVENT_OPTIMIZATION  line 16 
> > >> arg7 == 30
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2  -DPREVENT_OPTIMIZATION  line 18 
> > >> arg1 == 1
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2  -DPREVENT_OPTIMIZATION  line 18 
> > >> arg2 == 2
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2  -DPREVENT_OPTIMIZATION  line 18 
> > >> arg3 == 3
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2  -DPREVENT_OPTIMIZATION  line 18 
> > >> arg4 == 4
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2  -DPREVENT_OPTIMIZATION  line 18 
> > >> arg5 == 5
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2  -DPREVENT_OPTIMIZATION  line 18 
> > >> arg6 == 6
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2  -DPREVENT_OPTIMIZATION  line 18 
> > >> arg7 == 30
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2 -flto -fno-use-linker-plugin 
> > >> -flto-partition=none  -DPREVENT_OPTIMIZATION line 16 arg1 == 1
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2 -flto -fno-use-linker-plugin 
> > >> -flto-partition=none  -DPREVENT_OPTIMIZATION line 16 arg2 == 2
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2 -flto -fno-use-linker-plugin 
> > >> -flto-partition=none  -DPREVENT_OPTIMIZATION line 16 arg3 == 3
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2 -flto -fno-use-linker-plugin 
> > >> -flto-partition=none  -DPREVENT_OPTIMIZATION line 16 arg4 == 4
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2 -flto -fno-use-linker-plugin 
> > >> -flto-partition=none  -DPREVENT_OPTIMIZATION line 16 arg5 == 5
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2 -flto -fno-use-linker-plugin 
> > >> -flto-partition=none  -DPREVENT_OPTIMIZATION line 16 arg6 == 6
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2 -flto -fno-use-linker-plugin 
> > >> -flto-partition=none  -DPREVENT_OPTIMIZATION line 16 arg7 == 30
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2 -flto -fno-use-linker-plugin 
> > >> -flto-partition=none  -DPREVENT_OPTIMIZATION line 18 arg1 == 1
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2 -flto -fno-use-linker-plugin 
> > >> -flto-partition=none  -DPREVENT_OPTIMIZATION line 18 arg2 == 2
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2 -flto -fno-use-linker-plugin 
> > >> -flto-partition=none  -DPREVENT_OPTIMIZATION line 18 arg3 == 3
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2 -flto -fno-use-linker-plugin 
> > >> -flto-partition=none  -DPREVENT_OPTIMIZATION line 18 arg4 == 4
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2 -flto -fno-use-linker-plugin 
> > >> -flto-partition=none  -DPREVENT_OPTIMIZATION line 18 arg5 == 5
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2 -flto -fno-use-linker-plugin 
> > >> -flto-partition=none  -DPREVENT_OPTIMIZATION line 18 arg6 == 6
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2 -flto -fno-use-linker-plugin 
> > >> -flto-partition=none  -DPREVENT_OPTIMIZATION line 18 arg7 == 30
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2 -flto -fuse-linker-plugin 
> > >> -fno-fat-lto-objects  -DPREVENT_OPTIMIZATION line 16 arg1 == 1
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2 -flto -fuse-linker-plugin 
> > >> -fno-fat-lto-objects  -DPREVENT_OPTIMIZATION line 16 arg2 == 2
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2 -flto -fuse-linker-plugin 
> > >> -fno-fat-lto-objects  -DPREVENT_OPTIMIZATION line 16 arg3 == 3
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2 -flto -fuse-linker-plugin 
> > >> -fno-fat-lto-objects  -DPREVENT_OPTIMIZATION line 16 arg4 == 4
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2 -flto -fuse-linker-plugin 
> > >> -fno-fat-lto-objects  -DPREVENT_OPTIMIZATION line 16 arg5 == 5
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2 -flto -fuse-linker-plugin 
> > >> -fno-fat-lto-objects  -DPREVENT_OPTIMIZATION line 16 arg6 == 6
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2 -flto -fuse-linker-plugin 
> > >> -fno-fat-lto-objects  -DPREVENT_OPTIMIZATION line 16 arg7 == 30
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2 -flto -fuse-linker-plugin 
> > >> -fno-fat-lto-objects  -DPREVENT_OPTIMIZATION line 18 arg1 == 1
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2 -flto -fuse-linker-plugin 
> > >> -fno-fat-lto-objects  -DPREVENT_OPTIMIZATION line 18 arg2 == 2
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2 -flto -fuse-linker-plugin 
> > >> -fno-fat-lto-objects  -DPREVENT_OPTIMIZATION line 18 arg3 == 3
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2 -flto -fuse-linker-plugin 
> > >> -fno-fat-lto-objects  -DPREVENT_OPTIMIZATION line 18 arg4 == 4
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2 -flto -fuse-linker-plugin 
> > >> -fno-fat-lto-objects  -DPREVENT_OPTIMIZATION line 18 arg5 == 5
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2 -flto -fuse-linker-plugin 
> > >> -fno-fat-lto-objects  -DPREVENT_OPTIMIZATION line 18 arg6 == 6
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O2 -flto -fuse-linker-plugin 
> > >> -fno-fat-lto-objects  -DPREVENT_OPTIMIZATION line 18 arg7 == 30
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O3 -g  -DPREVENT_OPTIMIZATION  line 
> > >> 16 arg1 == 1
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O3 -g  -DPREVENT_OPTIMIZATION  line 
> > >> 16 arg2 == 2
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O3 -g  -DPREVENT_OPTIMIZATION  line 
> > >> 16 arg3 == 3
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O3 -g  -DPREVENT_OPTIMIZATION  line 
> > >> 16 arg4 == 4
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O3 -g  -DPREVENT_OPTIMIZATION  line 
> > >> 16 arg5 == 5
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O3 -g  -DPREVENT_OPTIMIZATION  line 
> > >> 16 arg6 == 6
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O3 -g  -DPREVENT_OPTIMIZATION  line 
> > >> 16 arg7 == 30
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O3 -g  -DPREVENT_OPTIMIZATION  line 
> > >> 18 arg1 == 1
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O3 -g  -DPREVENT_OPTIMIZATION  line 
> > >> 18 arg2 == 2
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O3 -g  -DPREVENT_OPTIMIZATION  line 
> > >> 18 arg3 == 3
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O3 -g  -DPREVENT_OPTIMIZATION  line 
> > >> 18 arg4 == 4
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O3 -g  -DPREVENT_OPTIMIZATION  line 
> > >> 18 arg5 == 5
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O3 -g  -DPREVENT_OPTIMIZATION  line 
> > >> 18 arg6 == 6
> > >> FAIL: gcc.dg/guality/pr36728-2.c   -O3 -g  -DPREVENT_OPTIMIZATION  line 
> > >> 18 arg7 == 30
> > >> FAIL: gcc.dg/guality/pr36728-4.c   -O2  -DPREVENT_OPTIMIZATION  line 14 
> > >> y == 2
> > >> FAIL: gcc.dg/guality/pr36728-4.c   -O2  -DPREVENT_OPTIMIZATION  line 16 
> > >> y == 2
> > >> FAIL: gcc.dg/guality/pr36728-4.c   -O2 -flto -fno-use-linker-plugin 
> > >> -flto-partition=none  -DPREVENT_OPTIMIZATION line 16 y == 2
> > >> FAIL: gcc.dg/guality/pr36728-4.c   -O2 -flto -fuse-linker-plugin 
> > >> -fno-fat-lto-objects  -DPREVENT_OPTIMIZATION line 14 y == 2
> > >> FAIL: gcc.dg/guality/pr36728-4.c   -O2 -flto -fuse-linker-plugin 
> > >> -fno-fat-lto-objects  -DPREVENT_OPTIMIZATION line 16 y == 2
> > >> FAIL: gcc.dg/guality/pr36728-4.c   -O3 -g  -DPREVENT_OPTIMIZATION  line 
> > >> 14 y == 2
> > >> FAIL: gcc.dg/guality/pr36728-4.c   -O3 -g  -DPREVENT_OPTIMIZATION  line 
> > >> 16 y == 2
> > >> FAIL: gcc.dg/guality/pr36728-4.c   -Os  -DPREVENT_OPTIMIZATION  line 14 
> > >> y == 2
> > >> FAIL: gcc.dg/guality/pr36728-4.c   -Os  -DPREVENT_OPTIMIZATION  line 16 
> > >> y == 2
> > >
> > > All of these are due to now the function is being cloned and the
> > > arguments are being removed as unused (they are testing the arguments
> > > are still there for debugging).
> > > So I suspect the functions should be marked as noclone in addition to
> > > what they are currently marked as noinline.
> > >
> > > What do others think?
> >
> > Cloning should have preserved the debug info for the removed parameters.  
> > At least ISTR this used to work.  If not, we should make it work ;)
>
> Sorry for that.  I looked into this testcase.  It fails for me no matter
> of the patch, so I think I need gdb update.  What happens is that I
> missed accounting asm statements as necessary
>
> diff --git a/gcc/ipa-fnsummary.cc b/gcc/ipa-fnsummary.cc
> index 87e08dad846..ac10d1c5533 100644
> --- a/gcc/ipa-fnsummary.cc
> +++ b/gcc/ipa-fnsummary.cc
> @@ -2804,7 +2804,8 @@ find_necessary_statements (struct cgraph_node *node)
>               || (is_ctrl_stmt (stmt)
>                   && (gimple_code (stmt) != GIMPLE_COND
>                       || !guards_builtin_unreachable (bb, cache)))
> -             || gimple_store_p (stmt))
> +             || gimple_store_p (stmt)
> +             || gimple_code (stmt) == GIMPLE_ASM)
>             mark_stmt_necessary (stmt, worklist);
>         }
>      }
> Since all stores needs to be treated as necessary in this mini-dce that
> runs without alias info. I am sure I was special casing GIMPLE_ASM at
> some stage, but probably removed it thinking it is handled by
> gimple_store_p.
>
> This slightly reduces size estimate and makes ipa-cp to clone:
>
> int __attribute__((noinline))
> foo (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7)
> {
>   char x[30];
>   int __attribute__ ((aligned(32))) y;
>
>   y = 2;
>   asm (NOP : "=m" (y), "=m" (b) : "m" (y));
>   x[0] = 25;
>   asm (NOP : "=m" (x[0]), "=m" (a) : "m" (x[0]), "m" (b));
>   return y;
> }
>
> because it thinks eliminating unused arg1...arg3 is a good idea.  Those
> args are not optimized out because they are replaced by constant,
> the are just dead, and the testcase checks that dead args
> are available.
>
> int
> main ()
> {
>   int l = 0;
>   asm ("" : "=r" (l) : "0" (l));
>   a = foo (l + 1, l + 2, l + 3, l + 4, l + 5, l + 6, l + 30);
>   asm volatile ("" :: "r" (l));
>   return 0;
> }
>
> So parameters are not constant, but optimized out as dead (thanks to
> asm).  So I think we can not trace values in debug info, because that
> would mean invoking asm ("" : "=r" (l) : "0" (l));
> from dwarf that is impossible.

Hmm, I guess even caller info doesn't help if the value isn't in a DW_OP there,
though it's constant at the caller, so ...

Richard.

> So it seems to me that while this time it caught useful but, overall the
> testcase is fragile depending on ipa-cp metrics deciding when cloning is
> good idea. So perhaps noclone attribute is good idea here.
> The original bug is about stack alignment breaing gdb.
>
> Honza

Reply via email to