Compiler construction LLVM无法检测非常简单的回路跳闸计数

Compiler construction LLVM无法检测非常简单的回路跳闸计数,compiler-construction,llvm,static-analysis,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-simpl

我试图通过标量演化分析来理解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

为什么这个非常简单的循环具有不可预测的行程计数?我在调用分析时是否做错了什么?这是LLVM 3.4。

借助此相关问题解决:

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

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