Hi all,
I have tried to use the loop-unroll pass on a large example, but without success. So I have tried on smaller examples, and I did not get more success.
My simplest example is attached. It comes from this C code (using llvm-gcc, but similar result with clang):
int main (int argc, char *argv) {
int i;
for (i = 0; i!=5; ++i) {}
return 0;
}
I use this command (version 2.8svn, from July 1st)
~/Build/llvm-trunk/Release/bin/opt -mem2reg -indvars -loop-unroll -stats loop.ll | llvm-dis
Whereas ScalarEvolution can compute the loop count, LoopInfo fails because the conditional branch is not in the expected block. If I provide the loop count with -unroll-count=5, then the function UnrollLoop fails form the same reason. The pass “-loopsimplify” has no effect.
If I add the pass “-loop-rotate” before “-indvars”, then the loop is successfully unrolled. However, I think this pass may increase the size of the code for all loops, including the loops that cannot be unrolled.
Is this a bug? Or is there any other pass that can help UnrollLoop?
loop.ll (920 Bytes)