Remove redundant checks added by loop unrolling
Philip Reames
listmail at philipreames.com
Tue Dec 2 15:42:28 PST 2014
Benjamin,
This doesn't really feel like the right approach to the problem. Adding
another run of GVN after every unrolling opportunity is a fairly heavy
weight hammer. Have you looked to see if there's a simple change you
could make to the unroller itself to handle this case? I haven't looked
at the code, but my suspicion is there would be.
Philip
On 11/29/2014 12:59 PM, Benjamin Poulain wrote:
> Hi,
>
> I noticed the optimized code generated for loops often include
> redundant checks that the size is not zero.
>
> For example, code like this:
> unsigned total = 0;
> for (unsigned i = 0; i < size; ++i) { ...
>
> when optimized, generate the following prologue:
> entry:
> %cmp4 = icmp eq i32 %size, 0
> br i1 %cmp4, label %for.end, label %for.body.lr.ph
>
> for.body.lr.ph: ; preds = %entry
> %0 = add i32 %size, -1
> %xtraiter = and i32 %size, 3
> %lcmp.mod = icmp ne i32 %xtraiter, 0
> %lcmp.overflow = icmp eq i32 %size, 0
> %lcmp.or = or i1 %lcmp.overflow, %lcmp.mod
> br i1 %lcmp.or, label %for.body.prol, label %for.body.lr.ph.split
>
> Notice the redundant test for "icmp eq i32 %size, 0". When compiled to
> target, we have one redundant check per loop that can never be true.
>
> The extra check for size==0 comes from LoopUnroll. It is never
> optimized out because LoopUnrollPass is run after the passes that
> could eliminate redundant conditions.
>
> I have attached a patch that fixes the problem. For every pass of
> LoopUnroll, I added a GVN pass to remove every redundant conditions
> and branches. My patch is without test, I need guidance on how to
> properly test this.
>
> Benjamin
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20141202/ab80bd63/attachment.html>
More information about the llvm-commits
mailing list