[PATCH] D22630: Loop rotation

Daniel Berlin via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 26 12:19:24 PDT 2016


Thanks, this is a great example :)


On Thu, Jul 21, 2016 at 1:43 PM, Sebastian Pop <sebpop at gmail.com> wrote:

> Here is an example that cannot be handled by PRE no matter what it
> does, as it cannot prove that the load B->at() is executed at least
> once, so it cannot move B->at(n*i) past the potential exception thrown
> by A->at():
>
> #include <vector>
>
> int fun(const std::vector<char>* A, const std::vector<char>* B, int n, int
> m)
> {
>   int res = 0;
>
>   for (int i = 0; i < m; ++i)
>     for (int j = 0; j < n; ++j)
>       res += A->at(n * i + j) + B->at(n * i + j);
>
>   return res;
> }
>
> the vector ->at() function contains bounds checks and may throw an
> exception, so after the load in A->at() can be hoisted, though the
> load in B->at() cannot because the A->at() may raise an exception.
>
> After loop rotate peels off one full iteration of the loop:
>
>    for (int i = 0; i < m; ++i) {
>     x = A->at(n * i);
>     if (exception)
>       throw;
>     y = B->at(n*i);
>     if(exception)
>       throw;
>     res += x + y;
>     for (int j = 0; j < n; ++j)
>       res += A->at(n * i + j) + B->at(n * i + j);
>    }
>
> we now have the B->at(n*i) redundancy without the hard problem of
> isGuaranteedToExecute,
> and PRE or LICM should be able to remove the redundant expression out
> of the innermost loop.
>
>
> On Thu, Jul 21, 2016 at 2:41 PM, Daniel Berlin <dberlin at dberlin.org>
> wrote:
> >
> >
> > On Thu, Jul 21, 2016 at 8:40 AM, Aditya Kumar via llvm-commits
> > <llvm-commits at lists.llvm.org> wrote:
> >>
> >> hiraditya created this revision.
> >> hiraditya added reviewers: hfinkel, sanjoy.
> >> hiraditya added subscribers: mzolotukhin, sebpop, jlebar, llvm-commits.
> >> Herald added a subscriber: sanjoy.
> >>
> >> This patch implements Loop Rotation Pass:
> >>
> >>  1. Canonicalize loop latch to have only one successor.
> >>  2. Clone all the BBs which are exiting the loop.
> >>  3. Adjust phi of cloned BBs
> >>  4. Add phi to the new loop header
> >>  5. Update DOM
> >>
> >> With this patch all the basic blocks which are exiting the loop can be
> >> copied during rotation. This is helpful for passes like gvn/licm which
> can
> >> now remove loop invariant code
> >> because some computations (which might not dominate all the basic blocks
> >> of loop) can now be PRE'd as they are available outside of the loop
> (due to
> >> loop rotation).
> >
> >
> > Can you give specific examples?
> >
> > If these are simply bad choices our PRE makes, we can just fix PRE
> instead
> > of rotate loops to fix PRE :)
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160726/694cf63c/attachment.html>


More information about the llvm-commits mailing list