Issues with using scalar evolution with newer versions of LLVM IR


I am trying to use scalar evolution pass using following command;

opt -analyze -mem2reg -indvars -loop-simplify -scalar-evolution < vec.bc
when vec.bc is generated using newer version of LLVM i.e LLVM 6 and 7 i get following message in the end;
Determining loop execution counts for: @main
Loop %8: Unpredictable backedge-taken count.
Loop %8: Unpredictable max backedge-taken count.
Loop %8: Unpredictable predicated backedge-taken count.

which means it is unable to compute iteration count.

However, when .bc file is generated using LLVM 4.0 i am getting following;

Determining loop execution counts for: @main
Loop %4: backedge-taken count is 512
Loop %4: max backedge-taken count is 512
Loop %4: Predicated backedge-taken count is 512

Loop %4: Trip multiple is 513

means correct computation of loop count…
Why is that happening with newer version of LLVM?

Please help.

It is hard to tell what's going on from the information you have
provided. How are you generating vec.bc? This could either be a
regression in scalar evolution or a change in some optimization pass
that is resulting in a different vec.bc.

-- Sanjoy

Thank You…
I used following command to generate .bc or .ll

/Documents/clang+llvm-4.0.0-x86_64-linux-gnu-ubuntu-16.04/bin/clang -O0 -emit-llvm -S -o vec4.ll vecsum.c
/Documents/clang+llvm-7.0.0-x86_64-linux-gnu-ubuntu-16.04/bin/clang -O0 -emit-llvm -S -o vec7.ll vecsum.c

Can you please provide the files vecsum.c, vec4.ll and vec7.ll?

-- Sanjoy

Your use of “-O0” here is causing the problem. In newer versions of clang, passing “-O0” to the compiler attaches the “optnone” attribute to each function, to avoid optimization during LTO. You can use “-O2 -Xclang -disable-llvm-passes” to dump IR intended for optimization, but without running any optimization passes.


Thank You