[PATCH GCC8][29/33]New register pressure estimation

Richard Biener richard.guenther@gmail.com
Wed May 17 12:27:00 GMT 2017


On Mon, May 15, 2017 at 5:50 PM, Bin.Cheng <amker.cheng@gmail.com> wrote:
> On Thu, May 11, 2017 at 11:39 AM, Richard Biener
> <richard.guenther@gmail.com> wrote:
>> On Tue, Apr 18, 2017 at 12:53 PM, Bin Cheng <Bin.Cheng@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.
> Hi,
> I removed the hot innermost part and here is the updated version.  Is it OK?

Ok.

> Thanks,
> bin
>
> 2017-05-11  Bin Cheng  <bin.cheng@arm.com>
>
>     * tree-ssa-loop-ivopts.c (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.
>
>>
>> Thanks,
>> Richard.
>>
>>> Thanks,
>>> bin
>>> 2017-04-11  Bin Cheng  <bin.cheng@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.



More information about the Gcc-patches mailing list