[llvm-dev] Question on induction variable simplification pass
Hal Finkel via llvm-dev
llvm-dev at lists.llvm.org
Wed Apr 12 17:38:36 PDT 2017
[+Sanjoy]
The fact that we lose information by widening during induction-variable
simplification is certainly a known problem. I don't recall if we've
ever really decided on a path forward. I personally suspect that, as an
information-destroying transformation, the widening should be moved to
the lowering phase (i.e. near where we do vectorization, etc.). Unless
the widening itself enables other transformations, I don't see why we
should do it early. The one exception I can think of is where it might
enable us to collapse redundant PHIs, as is:
int i = 0; long j = 0;
for (; i < n; ++i, ++j) { ... using i and j ... }
but that seems like a special case we could handle separately.
-Hal
On 04/12/2017 07:21 PM, Chawla, Pankaj via llvm-dev wrote:
>
> Hi all,
>
> It looks like the induction variable simplification pass prefers doing
> a zero-extension to compute the wider trip count of loops when
> extending the IV. This can sometimes result in loss of information
> making ScalarEvolution’s analysis conservative which can lead to
> missed performance opportunities.
>
> For example, consider this loopnest-
>
> int i, j;
>
> for(i=0; i< 40; i++)
>
> for(j=0; j< i-1; j++)
>
> A[i+j] = j;
>
> We are mainly interested in the backedge taken count of the inner loop.
>
> Before indvars, the backedge information computed by ScalarEvolution
> is as follows-
>
> Outer loop-
>
> backedge-taken count is 39
>
> max backedge-taken count is 39
>
> Inner loop-
>
> backedge-taken count is {-2,+,1}<nsw><%for.cond1.preheader>
>
> max backedge-taken count is 37
>
> After indvars, the backedge information computed by ScalarEvolution is
> as follows-
>
> Outer loop-
>
> backedge-taken count is 39
>
> max backedge-taken count is 39
>
> Inner loop-
>
> backedge-taken count is (-1 + (zext i32
> {-1,+,1}<nsw><%for.cond1.preheader> to i64))<nsw>
>
> max backedge-taken count is -1
>
> If we generate sext instead of zext, the information computed by
> ScalarEvolution is as follows-
>
> Outer loop-
>
> backedge-taken count is 39
>
> max backedge-taken count is 39
>
> Inner loop-
>
> backedge-taken count is {-2,+,1}<nw><%for.cond1.preheader>
>
> max backedge-taken count is -2
>
> We now have a simplified backedge taken count for the inner loop which
> is almost as precise as before indvars, except for the <nw> flag
> instead of <nsw> flag. I think ScalarEvolution should be able to
> precisely deduce wrap flags in the presence of sext but this may
> require a separate fix. The reason for the conservative max backedge
> taken count may be the same.
>
> Thanks,
>
> Pankaj
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
--
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170412/68ec1432/attachment.html>
More information about the llvm-dev
mailing list