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. 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.