[LLVMdev] Scalar Evolution not canonalizing division?

Nick Lewycky nlewycky at google.com
Wed Oct 27 17:31:21 PDT 2010


On 27 October 2010 14:20, Tobias Grosser <grosser at fim.uni-passau.de> wrote:

> Hi,
>
> I am just found a scalar evolution function that does not seem canonical to
> me.
>
> The C code I used to produce it is:
>
> long foo (long n, long m) {
>  long i, j;
>  long A[n][m];
>
>  for (i = 0; i < n; ++i)
>    for (j = 0; j < m; ++j)
>      A[i][j] = 1;
>
>  return A[42][42];
> }
>
> This produces after applying -mem2reg the attached LLVM-IR.
>
> For the store to the array A in the loop I get this scalar evolution
> function:
>
> {((8 * ({0,+,(8 * %m)}<%for.cond> /u 8)) + %vla),+,8}<%for.cond5>
>
> For me it seems the devision by "8" is not canonical. Is there any reason
> this can not be simplified to:
>
> {((1 * ({0,+,(1 * %m)}<%for.cond>)) + %vla),+,8}<%for.cond5>
>

Because we have to assume 2's complement arithmetic. Unless we know (or can
prove) that the "8 *" won't overflow, we can't safely fold it away against
"/u 8".

Nick


>
> which is actually this:
>
> {(({0,+,%m}<%for.cond>) + %vla),+,8}<%for.cond5>
>
> Any ideas
> Tobi
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20101027/8229f1a7/attachment.html>


More information about the llvm-dev mailing list