On Tue, Nov 5, 2013 at 11:13 AM, bin.cheng <bin.ch...@arm.com> wrote: > > >> -----Original Message----- >> From: gcc-patches-ow...@gcc.gnu.org [mailto:gcc-patches- >> ow...@gcc.gnu.org] On Behalf Of bin.cheng >> Sent: Monday, November 04, 2013 4:35 PM >> To: 'Richard Biener' >> Cc: GCC Patches >> Subject: RE: [PATCH GCC]Simplify address expression in IVOPT >> >> >> >> > -----Original Message----- >> > From: Richard Biener [mailto:richard.guent...@gmail.com] >> > Sent: Wednesday, October 30, 2013 10:46 PM >> > To: Bin Cheng >> > Cc: GCC Patches >> > Subject: Re: [PATCH GCC]Simplify address expression in IVOPT >> > >> > On Tue, Oct 29, 2013 at 10:18 AM, bin.cheng <bin.ch...@arm.com> wrote: >> > >> > Hmm. I think you want what get_inner_reference_aff does, using the >> > return value of get_inner_reference as starting point for >> determine_base_object. >> > And you don't want to restrict yourselves so much on what exprs to >> process, >> > but only exclude DECL_Ps. >> Did you mean I should pass all address expressions to >> get_inner_reference_aff except the one with declaration operand? >> I am a little confused here why DECL_Ps should be handled specially? > Seems >> it can be handled properly by the get_* function. Anything important I >> missed? >> >> > Just amend get_inner_reference_aff to return the tree base object. >> I found it's inappropriate to do this because: functions like >> get_inner_reference* only accept reference expressions, while base_object >> has to be computed for other kinds of expressions too. Take gimple >> statement "a_1 = *ptr_1" as an example, the base passed to alloc_iv is > ptr_1; >> the base_object computed by determine_base_object is also ptr_1, which >> we can't rely on get_inner_reference* . >> >> Also It seems the comment before determine_base_object might be >> inaccurate: >> " Returns a memory object to that EXPR points." which I think is " Returns > a >> pointer pointing to the main memory object to that EXPR points." >> Right? >> > >> > Note that this isn't really "simplifying" but rather lowering all >> addresses. >> > >> > The other changes in this patch are unrelated, right? >> Right, I should have named this message like "refine cost computation of >> expressions in IVOPT" just as the patch file. > > Hi, > I updated the patch according to review comments. Now it lowers all address > expressions except ones with DECL_P to get_inner_reference_aff, it also > computes base_object which is used later to ease determine_base_object. > > Bootstrap and test on x86/x86_64/arm on going, is it OK if tests pass?
static struct iv * alloc_iv (tree base, tree step) { + tree expr = base; + tree base_object = base; struct iv *iv = XCNEW (struct iv); gcc_assert (step != NULL_TREE); + /* Lower all address expressions except ones with DECL_P as oeprand. + By doing this: + 1) More accurate cost can be computed for address expressions; + 2) Duplicate candidates won't be created for bases in different + forms, like &a[0] and &a. */ + STRIP_NOPS (expr); + if (TREE_CODE (expr) == ADDR_EXPR && !DECL_P (TREE_OPERAND (expr, 0))) + { + aff_tree comb; + double_int size; + base_object = get_inner_reference_aff (TREE_OPERAND (expr, 0), + &comb, &size); + gcc_assert (base_object != NULL_TREE); + base = fold_convert (TREE_TYPE (base), aff_combination_to_tree (&comb)); + } + iv->base = base; - iv->base_object = determine_base_object (base); + iv->base_object = determine_base_object (base_object); for less confusion do not introduce 'expr' but just base_object (s/expr/base_object/). Also can you split out this change (and the related tree-affine.c one) from the rest? Ok with that change assuming it passes bootstrap & testing. Thanks, Richard. > Thanks. > bin > > gcc/testsuite/ChangeLog > 2013-11-05 Bin Cheng <bin.ch...@arm.com> > > * gcc.dg/tree-ssa/loop-2.c: Refine check condition. > * gcc.dg/tree-ssa/ivopt_infer_2.c: Ditto. > * gcc.dg/tree-ssa/ivopt_mult_3.c: Ditto. > > 2013-11-05 Bin Cheng <bin.ch...@arm.com> > > * tree-ssa-loop-ivopts.c (alloc_iv): Lower address expressions. > (get_shiftadd_cost): Check equality using operand_equal_p. > (force_expr_to_var_cost): Refactor the code. Handle type > conversion. > (split_address_cost): Call force_expr_to_var_cost. > * tree-affine.c (get_inner_reference_aff): Return base_addr. > * tree-affine.h (get_inner_reference_aff): Change prototype.