On Tue, Apr 18, 2017 at 12:53 PM, Bin Cheng <bin.ch...@arm.com> 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). 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 <bin.ch...@arm.com> > > * 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.