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