LLVM无法检测到非常简单的循环行程计数

时间:2014-05-18 20:50:52

标签: compiler-construction llvm static-analysis

我正在尝试了解如何使用标量演化分析在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。

1 个答案:

答案 0 :(得分:1)

借助此相关问题解决:

The use of getSmallConstantTripCount method of Loop in LLVM

添加mem2reg作为优化过程,并正确计算行程计数。

$ opt -analyze -mem2reg -indvars -loop-simplify -scalar-evolution < bug.bc