我正在尝试了解如何使用标量演化分析在LLVM中进行循环行程计数计算。但是,我无法使用简单的测试用例。
我有以下测试程序:
// bug.cpp
int main()
{
for (int i = 0; i < 16; i++) {
// do nothing
}
return 0;
}
我编译的是这样的:
$ clang++ -O0 -emit-llvm -c -o bug.bc bug.cpp
并像这样分析:
$ opt -analyze -indvars -loop-simplify -scalar-evolution < bug.bc
但是标量演化的输出是这样的:
...
Determining loop execution counts for: @main
Loop %for.cond: Unpredictable backedge-taken count.
Loop %for.cond: Unpredictable max backedge-taken count.
为什么这个非常简单的循环有一个不可预测的旅行计数?我在调用分析时做错了吗?这是LLVM 3.4。
答案 0 :(得分:1)
借助此相关问题解决:
The use of getSmallConstantTripCount method of Loop in LLVM
添加mem2reg
作为优化过程,并正确计算行程计数。
$ opt -analyze -mem2reg -indvars -loop-simplify -scalar-evolution < bug.bc