On Wed, Dec 16, 2015 at 06:15:33PM +0100, Jan Hubicka wrote: > > On Wed, Dec 16, 2015 at 05:24:25PM +0100, Jan Hubicka wrote: > > > 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 long as the values that would be passed to the unused parameters are > > constant or live in memory or registers that isn't clobbered by the call in > > the caller, we have the ability to express that in the debug info now, and > > we should. > 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; > } > > the unused parameters are not constant because of the asm block and we simply > do not > compute them if cloning happens. The following patch to the testcase
So, we had a debuginfo QoI bug before, but with the change we hit that now way more often than in the past, which makes it a debuginfo quality regression. But, we still do emit the right debuginfo stuff for volatile int vv; static __attribute__ ((noinline)) int f1 (int x, int y, int z) { int a = x * 2; int b = y * 2; int c = z * 2; vv++; return x + z; } int u1 (int x) { return f1 (x, 2, 3); } and I really can't see what is the difference between that and say the pr36728-1.c testcase or the one with your modification to also pass in a constant. This one also has one used argument, some unused ones, and some where a constant is passed. BTW, if I adjust your modified pr36728-1.c so that cst is used somewhere, then that parameter is passed, rather than optimized away as I'd expect (and as happens on the above testcase). So, clearly there are multiple ways to perform the same parameter optimizations, one in isra (though I don't see anything to scalarize above), another one in ipa-cp or where, and only some of them hit the debug info creation for the optimized away arguments. Thus the question is why we have multiple spots to do the same thing, what is so different between the testcases, and what do we need to change to emit the debug info we should, and what we should change to emit the cst below if it is used, if we already clone it anyway. > Index: testsuite/gcc.dg/guality/pr36728-1.c > =================================================================== > --- testsuite/gcc.dg/guality/pr36728-1.c (revision 231022) > +++ testsuite/gcc.dg/guality/pr36728-1.c (working copy) > @@ -7,7 +7,7 @@ > int a, b; > > int __attribute__((noinline)) > -foo (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7) > +foo (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7, > int cst) > { > char *x = __builtin_alloca (arg7); > int __attribute__ ((aligned(32))) y; > @@ -48,7 +48,7 @@ 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); > + a = foo (l + 1, l + 2, l + 3, l + 4, l + 5, l + 6, l + 30, 7); > asm volatile ("" :: "r" (l)); > return 0; > } > > makes it fail on GCC 5 tree, too. The extra unused constant argument makes > GCC 5 > to clone foo and optimize out l, too. Jakub