[LLVMdev] Scalar Evolution not canonalizing division?

Tobias Grosser grosser at fim.uni-passau.de
Wed Oct 27 14:20:55 PDT 2010


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>

which is actually this:

{(({0,+,%m}<%for.cond>) + %vla),+,8}<%for.cond5>

Any ideas
Tobi
-------------- next part --------------
A non-text attachment was scrubbed...
Name: two_dim.c
Type: text/x-csrc
Size: 156 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20101027/e2316b6c/attachment.c>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: two_dim.preopt.ll
Type: application/octet-stream
Size: 836 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20101027/e2316b6c/attachment.obj>


More information about the llvm-dev mailing list