On Tue, Nov 5, 2013 at 11:13 AM, bin.cheng <[email protected]> wrote:
>
>
>> -----Original Message-----
>> From: [email protected] [mailto:gcc-patches-
>> [email protected]] 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:[email protected]]
>> > 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 <[email protected]> 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 <[email protected]>
>
> * 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 <[email protected]>
>
> * 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.