> On Thu, Dec 10, 2015 at 08:30:37AM +0100, Jan Hubicka wrote: > > * ipa-cp.c (ipcp_cloning_candidate_p): Use node->optimize_for_size_p. > > (good_cloning_opportunity_p): Likewise. > > (gather_context_independent_values): Do not return true when > > polymorphic call context is known or when we have known aggregate > > value of unused parameter. > > (estimate_local_effects): Try to create clone for all context > > when either some params are substituted or devirtualization is possible > > or some params can be removed; use local flag instead of > > node->will_be_removed_from_program_if_no_direct_calls_p. > > (identify_dead_nodes): Likewise. > > This commit breaks several guality tests on S/390x:
The patch changes ipa-cp heuristics in a way that it will clone in order to remove unused parameter. Previously it did know how to remove unused parameter but would do so only if some of function's parameter (perhaps the unused one) was also constant. This is inconsistent. As a result we do more ipa-cp cloning and I suppose we are more likely to hit them on guality for simplified testcases that often contain unused code: int __attribute__((noinline)) foo (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7) { char *x = __builtin_alloca (arg7); 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; } 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; } I am trying to understand Jakub's debug code and perhaps it can be improved. But in the case of optimized out unused parameters I think it is perfectly resonable to say that the variable was optimized out. As you can see, the testcase explicitely prevents ipa-cp constant propagation by the asm statement. We can just update the testcases to use the parameters and test the original issue again. > > +FAIL: gcc.dg/guality/pr36728-1.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 16 arg3 == 3 > +FAIL: gcc.dg/guality/pr36728-1.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 16 arg4 == 4 > +FAIL: gcc.dg/guality/pr36728-1.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 16 arg5 == 5 > +FAIL: gcc.dg/guality/pr36728-1.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 16 arg6 == 6 > +FAIL: gcc.dg/guality/pr36728-1.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 16 y == 2 > +FAIL: gcc.dg/guality/pr36728-1.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 18 arg3 == 3 > +FAIL: gcc.dg/guality/pr36728-1.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 18 arg4 == 4 > +FAIL: gcc.dg/guality/pr36728-1.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 18 arg5 == 5 > +FAIL: gcc.dg/guality/pr36728-1.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 18 arg6 == 6 > +FAIL: gcc.dg/guality/pr36728-1.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 18 y == 2 > +FAIL: gcc.dg/guality/pr36728-1.c -O3 -g line 16 arg3 == 3 > +FAIL: gcc.dg/guality/pr36728-1.c -O3 -g line 16 arg4 == 4 > +FAIL: gcc.dg/guality/pr36728-1.c -O3 -g line 16 arg5 == 5 > +FAIL: gcc.dg/guality/pr36728-1.c -O3 -g line 16 arg6 == 6 > +FAIL: gcc.dg/guality/pr36728-1.c -O3 -g line 16 y == 2 > +FAIL: gcc.dg/guality/pr36728-1.c -O3 -g line 18 arg3 == 3 > +FAIL: gcc.dg/guality/pr36728-1.c -O3 -g line 18 arg4 == 4 > +FAIL: gcc.dg/guality/pr36728-1.c -O3 -g line 18 arg5 == 5 > +FAIL: gcc.dg/guality/pr36728-1.c -O3 -g line 18 arg6 == 6 > +FAIL: gcc.dg/guality/pr36728-1.c -O3 -g line 18 y == 2 > FAIL: gcc.dg/guality/pr36728-2.c -O2 line 18 *x == (char) 25 > FAIL: gcc.dg/guality/pr36728-2.c -O2 -flto -fno-use-linker-plugin > -flto-partition=none line 18 *x == (char) 25 > +FAIL: gcc.dg/guality/pr36728-2.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 16 arg3 == 3 > +FAIL: gcc.dg/guality/pr36728-2.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 16 arg4 == 4 > +FAIL: gcc.dg/guality/pr36728-2.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 16 arg5 == 5 > +FAIL: gcc.dg/guality/pr36728-2.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 16 arg6 == 6 > +FAIL: gcc.dg/guality/pr36728-2.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 16 arg7 == 30 > +FAIL: gcc.dg/guality/pr36728-2.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 16 y == 2 > FAIL: gcc.dg/guality/pr36728-2.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 18 *x == (char) 25 > +FAIL: gcc.dg/guality/pr36728-2.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 18 arg3 == 3 > +FAIL: gcc.dg/guality/pr36728-2.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 18 arg4 == 4 > +FAIL: gcc.dg/guality/pr36728-2.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 18 arg5 == 5 > +FAIL: gcc.dg/guality/pr36728-2.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 18 arg6 == 6 > +FAIL: gcc.dg/guality/pr36728-2.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 18 arg7 == 30 > +FAIL: gcc.dg/guality/pr36728-2.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 18 y == 2 > +FAIL: gcc.dg/guality/pr36728-2.c -O3 -g line 16 arg3 == 3 > +FAIL: gcc.dg/guality/pr36728-2.c -O3 -g line 16 arg4 == 4 > +FAIL: gcc.dg/guality/pr36728-2.c -O3 -g line 16 arg5 == 5 > +FAIL: gcc.dg/guality/pr36728-2.c -O3 -g line 16 arg6 == 6 > +FAIL: gcc.dg/guality/pr36728-2.c -O3 -g line 16 arg7 == 30 > +FAIL: gcc.dg/guality/pr36728-2.c -O3 -g line 16 y == 2 > FAIL: gcc.dg/guality/pr36728-2.c -O3 -g line 18 *x == (char) 25 > +FAIL: gcc.dg/guality/pr36728-2.c -O3 -g line 18 arg3 == 3 > +FAIL: gcc.dg/guality/pr36728-2.c -O3 -g line 18 arg4 == 4 > +FAIL: gcc.dg/guality/pr36728-2.c -O3 -g line 18 arg5 == 5 > +FAIL: gcc.dg/guality/pr36728-2.c -O3 -g line 18 arg6 == 6 > +FAIL: gcc.dg/guality/pr36728-2.c -O3 -g line 18 arg7 == 30 > +FAIL: gcc.dg/guality/pr36728-2.c -O3 -g line 18 y == 2 > FAIL: gcc.dg/guality/pr36728-2.c -Os line 18 *x == (char) 25 > +FAIL: gcc.dg/guality/pr36728-3.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 14 arg3 == 3 > +FAIL: gcc.dg/guality/pr36728-3.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 14 arg4 == 4 > +FAIL: gcc.dg/guality/pr36728-3.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 14 arg5 == 5 > +FAIL: gcc.dg/guality/pr36728-3.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 14 arg6 == 6 > +FAIL: gcc.dg/guality/pr36728-3.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 16 arg3 == 3 > +FAIL: gcc.dg/guality/pr36728-3.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 16 arg4 == 4 > +FAIL: gcc.dg/guality/pr36728-3.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 16 arg5 == 5 > +FAIL: gcc.dg/guality/pr36728-3.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 16 arg6 == 6 > +FAIL: gcc.dg/guality/pr36728-3.c -O3 -g line 14 arg3 == 3 > +FAIL: gcc.dg/guality/pr36728-3.c -O3 -g line 14 arg4 == 4 > +FAIL: gcc.dg/guality/pr36728-3.c -O3 -g line 14 arg5 == 5 > +FAIL: gcc.dg/guality/pr36728-3.c -O3 -g line 14 arg6 == 6 > +FAIL: gcc.dg/guality/pr36728-3.c -O3 -g line 16 arg3 == 3 > +FAIL: gcc.dg/guality/pr36728-3.c -O3 -g line 16 arg4 == 4 > +FAIL: gcc.dg/guality/pr36728-3.c -O3 -g line 16 arg5 == 5 > +FAIL: gcc.dg/guality/pr36728-3.c -O3 -g line 16 arg6 == 6 > +FAIL: gcc.dg/guality/pr36728-4.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 14 arg3 == 3 > +FAIL: gcc.dg/guality/pr36728-4.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 14 arg4 == 4 > +FAIL: gcc.dg/guality/pr36728-4.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 14 arg5 == 5 > +FAIL: gcc.dg/guality/pr36728-4.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 14 arg6 == 6 > +FAIL: gcc.dg/guality/pr36728-4.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 14 arg7 == 30 > +FAIL: gcc.dg/guality/pr36728-4.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 16 arg3 == 3 > +FAIL: gcc.dg/guality/pr36728-4.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 16 arg4 == 4 > +FAIL: gcc.dg/guality/pr36728-4.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 16 arg5 == 5 > +FAIL: gcc.dg/guality/pr36728-4.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 16 arg6 == 6 > +FAIL: gcc.dg/guality/pr36728-4.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 16 arg7 == 30 > +FAIL: gcc.dg/guality/pr36728-4.c -O3 -g line 14 arg3 == 3 > +FAIL: gcc.dg/guality/pr36728-4.c -O3 -g line 14 arg4 == 4 > +FAIL: gcc.dg/guality/pr36728-4.c -O3 -g line 14 arg5 == 5 > +FAIL: gcc.dg/guality/pr36728-4.c -O3 -g line 14 arg6 == 6 > +FAIL: gcc.dg/guality/pr36728-4.c -O3 -g line 14 arg7 == 30 > +FAIL: gcc.dg/guality/pr36728-4.c -O3 -g line 16 arg3 == 3 > +FAIL: gcc.dg/guality/pr36728-4.c -O3 -g line 16 arg4 == 4 > +FAIL: gcc.dg/guality/pr36728-4.c -O3 -g line 16 arg5 == 5 > +FAIL: gcc.dg/guality/pr36728-4.c -O3 -g line 16 arg6 == 6 > +FAIL: gcc.dg/guality/pr36728-4.c -O3 -g line 16 arg7 == 30 > ... > FAIL: gcc.dg/guality/vla-1.c -O1 line 17 sizeof (a) == 6 > FAIL: gcc.dg/guality/vla-1.c -O2 line 17 sizeof (a) == 6 > FAIL: gcc.dg/guality/vla-1.c -O2 -flto -fno-use-linker-plugin > -flto-partition=none line 17 sizeof (a) == 6 > +FAIL: gcc.dg/guality/vla-1.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 17 i == 5 > FAIL: gcc.dg/guality/vla-1.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects line 17 sizeof (a) == 6 > +FAIL: gcc.dg/guality/vla-1.c -O3 -g line 17 i == 5 > FAIL: gcc.dg/guality/vla-1.c -O3 -g line 17 sizeof (a) == 6 > FAIL: gcc.dg/guality/vla-1.c -Os line 17 sizeof (a) == 6 > > What can I do to help fixing this? > > Ciao > > Dominik ^_^ ^_^ > > -- > > Dominik Vogt > IBM Germany