This is the mail archive of the
mailing list for the GCC project.
Re: Loop reversal
On Mon, Jul 17, 2017 at 11:56:50AM +0200, Richard Biener wrote:
> On Thu, Jul 13, 2017 at 2:18 AM, Kugan Vivekanandarajah
> <email@example.com> wrote:
> > I am looking into reversing loop to increased efficiency. There is
> > already a PR22041 for this and an old patch
> > https://gcc.gnu.org/ml/gcc-patches/2006-01/msg01851.html by Zdenek
> > which never made it to mainline.
> > For constant loop count, ivcanon pass is adding reverse iv but this
> > not selected by ivopt.
> ivopt will never do loop reversal, if it would select this IV it would need to
> keep the original one as well or compute the old i based on the new.
> loop reversal needs dependence analysis and it's not clear if for the copy
> case you quote would be profitable (HW prefetchers like that?). For your
> case it's also invalid as a and c may overlap.
If the goal is to make the induction variable end at 0, you can transform
[0..N) into [-N..0). I have some old patches to do that; it probably
is better to start from scratch if you want it though.
Two issues that had to be solved for this:
1) ivopts didn't cost the cheaper loop ending condition correctly;
2) where you had say a[i] in the loop it will be (a+N)[i] afterwards,
and the calculation of a+N wasn't properly hoisted out of the loop.