Hi Bin,

On 4 May 2017 at 17:25, Bin.Cheng <amker.ch...@gmail.com> wrote:
> On Wed, Apr 26, 2017 at 11:18 AM, Richard Biener
> <richard.guent...@gmail.com> wrote:
>> On Wed, Apr 26, 2017 at 12:12 PM, Bin.Cheng <amker.ch...@gmail.com> wrote:
>>> On Wed, Apr 26, 2017 at 10:50 AM, Richard Biener
>>> <richard.guent...@gmail.com> wrote:
>>>> On Tue, Apr 18, 2017 at 12:43 PM, Bin Cheng <bin.ch...@arm.com> wrote:
>>>>> Hi,
>>>>> This is the major part of this patch series.  It rewrites cost 
>>>>> computation of ivopts using tree affine.
>>>>> Apart from description given by cover message:
>>>>>   A) New computation cost model.  Currently, there are big amount code 
>>>>> trying to understand
>>>>>      tree expression and estimate its computation cost.  The model is 
>>>>> designed long ago
>>>>>      for generic tree expressions.  In order to process generic 
>>>>> expression (even address
>>>>>      expression of array/memory references), it has code for too many 
>>>>> corner cases.  The
>>>>>      problem is it's somehow impossible to handle all complicated 
>>>>> expressions, even with
>>>>>      complicated logic in functions like get_computation_cost_at, 
>>>>> difference_cost,
>>>>>      ptr_difference_cost, get_address_cost and so on...  The second 
>>>>> problem is it's hard
>>>>>      to keep cost model consistent among special cases.  As special cases 
>>>>> being added
>>>>>      from time to time, the model is no long unified any more.  There are 
>>>>> cases that right
>>>>>      cost results in bad code, or vice versa, wrong cost results in good 
>>>>> code.  Finally,
>>>>>      it's difficult to add code for new cases.
>>>>>      This patch introduces a new cost computation model by using tree 
>>>>> affine.  Tree exprs
>>>>>      are lowered to aff_tree which is simple arithmetic operation 
>>>>> usually.  Code handling
>>>>>      special cases is no longer necessary, which brings us quite 
>>>>> simplicity.  It is also
>>>>>      easier to compute consistent costs among different expressions using 
>>>>> tree affine,
>>>>>      which gives us a unified cost model.
>>>>> This patch also fixes issue that cost computation for address type iv_use 
>>>>> is inconsistent
>>>>> with how it is re-rewritten in the end.  It greatly simplified cost 
>>>>> computation.
>>>>>
>>>>> Is it OK?
>>>>
>>>> The patch is quite hard to follow (diff messes up here -- this is a
>>>> case where a context
>>> Hi Richard,
>>> Thanks for reviewing, attachment is the updated context diff.  It also
>>> includes a minor fix handling pre-increment addressing mode,
>>> specifically, it adds two lines of code:
>>>
>>>  if (stmt_after_increment (data->current_loop, cand, use->stmt))
>>>             ainc_offset += ainc_step;
>>>
>>>
>>>> diff is easier to read).  I trust you on the implementation details
>>>> here, the overall structure
>>>> looks ok to me.  The only question I have is with regarding to
>>>> get_loop_invariant_expr
>>>> which seems to be much less sophisticated than before (basically it's
>>>> now what was
>>>> record_inv_expr?).  I suppose the old functionality is superseeded by
>>>> using affines
>>>> everywhere else.
>>> Yes, previous version tries a lot to cancel common sub expression when
>>> representing use with cand.  New version relies on tree affine which
>>> is much better.  One problem with invariant expression estimation is
>>> we don't know in IVOPT if the inv_expr would be hoisted or not by
>>> later passes.  This problem exists all the time, we can only make
>>> assumptions here, I think new version is bit more aggressive in
>>> recording new inv_expr here.
>>
>> Thanks.
>>
>> LGTM.
> Trivial update replacing calls to aff_combination_simple_p because of
> change in previous patch.
>
> Thanks,
> bin

This commit (r247885) causes regressions on aarch64:
  - PASS now FAIL             [PASS => FAIL]:

  Executed from: gcc.target/aarch64/aarch64.exp
    gcc.target/aarch64/pr62178.c scan-assembler ld1r\\t{v[0-9]+.

Christophe

>>
>> Richard.
>>
>>> Thanks,
>>> bin
>>>>
>>>> Otherwise ok.
>>>>
>>>> Thanks,
>>>> Richard.
>>>>
>>>>
>>>>> Thanks,
>>>>> bin
>>>>> 2017-04-11  Bin Cheng  <bin.ch...@arm.com>
>>>>>
>>>>>         * tree-ssa-loop-ivopts.c (get_loop_invariant_expr): Simplify.
>>>>>         (adjust_setup_cost): New parameter supporting round up adjustment.
>>>>>         (struct address_cost_data): Delete.
>>>>>         (force_expr_to_var_cost): Don't bound cost with spill_cost.
>>>>>         (split_address_cost, ptr_difference_cost): Delete.
>>>>>         (difference_cost, compare_aff_trees, record_inv_expr): Delete.
>>>>>         (struct ainc_cost_data): New struct.
>>>>>         (get_address_cost_ainc): New function.
>>>>>         (get_address_cost, get_computation_cost): Reimplement.
>>>>>         (determine_group_iv_cost_address): Record inv_expr for all uses of
>>>>>         a group.
>>>>>         (determine_group_iv_cost_cond): Call get_loop_invariant_expr.
>>>>>         (iv_ca_has_deps): Reimplemented to ...
>>>>>         (iv_ca_more_deps): ... this.  Check if NEW_CP introduces more deps
>>>>>         than OLD_CP.
>>>>>         (iv_ca_extend): Call iv_ca_more_deps.

Reply via email to