On Thu, May 11, 2017 at 11:39 AM, Richard Biener <[email protected]> wrote: > On Tue, Apr 18, 2017 at 12:53 PM, Bin Cheng <[email protected]> wrote: >> Hi, >> Currently IVOPTs shares the same register pressure computation with RTL loop >> invariant pass, >> which doesn't work very well. This patch introduces specific interface for >> IVOPTs. >> The general idea is described in the cover message as below: >> C) Current implementation shares the same register pressure computation >> with RTL loop >> inv pass. It has difficulty in handling (especially large) loop nest, >> and quite >> often generating too many candidates (especially for outer loops). >> This change >> introduces new register pressure computation. The brief idea is to >> differentiate >> (hot) innermost loop and outer loop. for (possibly hot) inner most, >> more registers >> are allowed as long as the register pressure is within the range of >> number of target >> available registers. >> It can also help to restrict number of candidates for outer loop. >> Is it OK? > > +/* Determine if current loop is the innermost loop and maybe hot. */ > + > +static void > +determine_hot_innermost_loop (struct ivopts_data *data) > +{ > + data->hot_innermost_loop_p = true; > + if (!data->speed) > + return; > > err, so when not optimizing for speed we assume all loops (even not innermost) > are hot and innermost?! > > + HOST_WIDE_INT niter = avg_loop_niter (loop); > + if (niter < PARAM_VALUE (PARAM_AVG_LOOP_NITER) > + || loop_constraint_set_p (loop, LOOP_C_PROLOG) > + || loop_constraint_set_p (loop, LOOP_C_EPILOG) > + || loop_constraint_set_p (loop, LOOP_C_VERSION)) > + data->hot_innermost_loop_p = false; > > this needs adjustment for the constraint patch removal. Also looking at niter > of the loop in question insn't a good metric for hotness. data->speed is the > best guess you get I think (optimize_loop_for_speed_p). Yes, I also found this is inefficient finding the targeting loops. I will update and benchmark new patch discarding all *hot innermost* part. It can always be improved in future.
Thanks, bin > > data->speed = optimize_loop_for_speed_p (loop); > + determine_hot_innermost_loop (data); > > data->hot_innermost_loop_p = determine_hot_innermost_loop (data); > > would be more consistent here. > > Thanks, > Richard. > >> Thanks, >> bin >> 2017-04-11 Bin Cheng <[email protected]> >> >> * tree-ssa-loop-ivopts.c (struct ivopts_data): New field. >> (ivopts_estimate_reg_pressure): New reg_pressure model function. >> (ivopts_global_cost_for_size): Delete. >> (determine_set_costs, iv_ca_recount_cost): Call new model function >> ivopts_estimate_reg_pressure. >> (determine_hot_innermost_loop): New. >> (tree_ssa_iv_optimize_loop): Call above function.
