On Mon, Mar 19, 2012 at 2:19 AM, Andrew Pinski <pins...@gmail.com> wrote:
> On Sun, Mar 18, 2012 at 6:12 PM, William J. Schmidt
> <wschm...@linux.vnet.ibm.com> wrote:
>> Greetings,
>>
>> Now that we're into stage 1 again, I'd like to submit the first round of
>> changes for dominator-based strength reduction, which will address
>> issues from PR22586, PR35308, PR46556, and perhaps others.  I'm
>> attaching two patches: the smaller (slsr-part1) is the patch I'm
>> submitting for approval today, while the larger (slsr-fyi) is for
>> reference only, but may be useful if questions arise about how the small
>> patch fits into the intended whole.
>>
>> This patch contains the logic for identifying strength reduction
>> candidates, and makes replacements only for those candidates where the
>> stride is a fixed constant.  Replacement for candidates with fixed but
>> unknown strides are not implemented herein, but that logic can be viewed
>> in the larger patch.  This patch does not address strength reduction of
>> data reference expressions, or candidates with conditional increments;
>> those issues will be dealt with in future patches.
>>
>> The cost model is built on the one used by tree-ssa-ivopts.c, and I've
>> added some new instruction costs to that model in place.  It might
>> eventually be good to divorce that modeling code from IVOPTS, but that's
>> an orthogonal patch and somewhat messy.
>
> I think this is the wrong way to do straight line strength reduction
> considering we have a nice value numbering system which should be easy
> to extended to support it.

Well, it is easy to handle very specific easy cases like

a = i * 2;
b = i * 3;
c = i * 4;

to transform it to

a = i * 2;
b = a + i;
c = b + i;

but already

a = i * 2;
b = i * 4;
c = i * 6;

would need extra special code.  The easy case could be handled in eliminate ()
by, when seeing A * CST, looking up A * (CST - 1) and if that
succeeds, transform
it to VAL + A.  Cost issues are increasing the lifetime of VAL.  I've done this
simple case at some point, but it failed to handle the common associated cases,
when we transform (a + 1) * 2, (a + 1) * 3, etc. to a * 2 + 2, a * 3 +
3, etc.  I think
it is the re-association in case of a strength-reduction opportunity
that makes the
separate pass better?  How would you suggest handling this case in the
VN framework?  Detect the a * 3 + 3 pattern and then do two lookups, one for
a * 2 and one for val + 2?  But then we still don't have a value for a + 1
to re-use ...

Bill, experimenting with pattern detection in eliminate () would be a
possibility.

Thanks,
Richard.



> Thanks,
> Andrew pinski
>
>
>>
>> Thanks,
>> Bill
>>
>>
>> gcc:
>>
>> 2012-03-18  Bill Schmidt  <wschm...@linux.vnet.ibm.com>
>>
>>        * tree-pass.h (pass_strength_reduction): New decl.
>>        * tree-ssa-loop-ivopts.c (add_cost): Remove #undef; rename to
>>        add_regs_cost.
>>        (multiply_regs_cost): New function.
>>        (add_const_cost): Likewise.
>>        (extend_or_trunc_cost): Likewise.
>>        (negate_cost): Likewise.
>>        (get_address_cost): Rename add_cost to add_regs_cost.
>>        (force_expr_to_var_cost): Likewise.
>>        (get_computation_cost_at): Likewise.
>>        (determine_iv_cost): Likewise.
>>        * timevar.def (TV_TREE_SLSR): New timevar.
>>        * tree-ssa-strength-reduction.c: New.
>>        * tree-flow.h (add_regs_cost): New decl.
>>        (multiply_regs_cost): Likewise.
>>        (add_const_cost): Likewise.
>>        (extend_or_trunc_cost): Likewise.
>>        (negate_cost): Likewise.
>>        * Makefile.in (tree-ssa-strength-reduction.o): New dependencies.
>>        * passes.c (init_optimization_passes): Add pass_strength_reduction.
>>
>> gcc/testsuite:
>>
>> 2012-03-18  Bill Schmidt  <wschm...@linux.vnet.ibm.com>
>>
>>        * gcc.dg/tree-ssa/slsr-1.c: New test.
>>        * gcc.dg/tree-ssa/slsr-2.c: Likewise.
>>        * gcc.dg/tree-ssa/slsr-3.c: Likewise.
>>        * gcc.dg/tree-ssa/slsr-4.c: Likewise.
>>

Reply via email to