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

Reply via email to