Hi, as discussed on IRC today, I would like to re-apply the patch to fix bogus realistic bounds in niter. As it turned out, we seem to rely on this bogus estimate in few benchmarks and there is miscompilation with avx512.
The performance regressions should be solved my planned patch to introduce likely upper bounds - here we can track the assumption that there are no trailing arrays in the structures. I plan to send it after some benchmarking. Moreover we can get smarter about tracking trailing arrays. We seem to get wrong MEM_REFs (as noticed by Richard), we may disable the path for non-C based languages (regresions are for Fortran testcases) and we can track object sizes. I plan to do that step-by-step so possible additional fallout is easier to track. This patch re-instantiate first fix included in the orignial patch - ivopts should consider max_stmt-executions_int when giving an estimate on number of iterations. Bootstrapped/regtested x86_64-linux, comitted. Honza Index: ChangeLog =================================================================== --- ChangeLog (revision 235157) +++ ChangeLog (working copy) @@ -1,3 +1,8 @@ +2016-04-17 Jan Hubicka <j...@suse.cz> + + * tree-ssa-loop-ivopts.c (avg_loop_niter): Use also + max_loop_iterations_int. + 2016-04-18 Richard Biener <rguent...@suse.de> PR tree-optimization/43434 Index: tree-ssa-loop-ivopts.c =================================================================== --- tree-ssa-loop-ivopts.c (revision 235064) +++ tree-ssa-loop-ivopts.c (working copy) @@ -121,7 +121,11 @@ avg_loop_niter (struct loop *loop) { HOST_WIDE_INT niter = estimated_stmt_executions_int (loop); if (niter == -1) - return AVG_LOOP_NITER (loop); + { + niter = max_stmt_executions_int (loop); + if (niter == -1 || niter > AVG_LOOP_NITER (loop)) + return AVG_LOOP_NITER (loop); + } return niter; }