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