LLVM中Loop的getSmallConstantTripCount方法的使用

dal*_*cai 2 compiler-construction optimization llvm

在我的通行证中,我添加了LoopInfo必需的通行证。然后我想打印每个循环的恒定循环行程计数(如果有的话)。然而,每次我调用 时getSmallConstantTripCount,它都会返回 0,即使对于一个非常简单的循环也是如此:

for(i=0; i<3; ++i) {;}  
Run Code Online (Sandbox Code Playgroud)

知道为什么吗?

小智 5

LLVM有一个原则,就是让每个部分做最少的工作。LoopInfo::getSmallConstantTripCount 不做任何花哨的分析,它寻找一个具有单个后沿的简单循环,每次将值递增 1,并使用 != 与常量整数进行比较。

当您编译在 -O0 处编写的代码时,每个“i < 3”实际上都会导致从内存加载以读取“i”的最新值。LoopInfo 当然不会进行必要的分析类型来确定不需要内存访问,这是“opt -mem2reg”的工作。尝试运行该优化,也许可以在代码上使用 -instcombine -loopsimplify -loop-rotate 使其达到 getSmallConstantTripCount 将处理的形状。