我有一段代码,我希望LLVM以某个因素展开其中的所有循环。我使用以下命令:
-unroll-count=3
具体来说,-loop-unroll
和-unroll-count=3
处理循环展开的东西 - 其余只是转换代码,以便LLVM可以展开代码。
此命令是否保证所有循环都将展开3倍?或者更像是在GCC中使用编译指示语句,如果编译器认为非最佳,编译器可以选择忽略它?换句话说,// RegExp way
function getLastChar1(str){
var r = (/.$/).exec(str);
if(r){
return r[0]
}
return str;
}
// last string way
function getLastChar2(str){
if(str.length){
return str[str.length-1]
}
return str;
}
console.log(getLastChar1("Hello Word!"))
console.log(getLastChar2("Hello Word!"))
和{{1}}传递强制编译器使用展开因子3还是更多的"提示"编译器可以选择忽略吗?
答案 0 :(得分:1)
此命令是否保证所有循环都将由a展开 因子3?
简短的回答是否定的。
首先,它取决于循环。例如,如果它是指针追逐循环,那么这是一个主要的抑制因素。展开的决定因素是能够在编译时计算行程计数。因此,循环展开的主要帮助是执行indvars
传递。
围绕LoopUnroll.cpp
和LoopUnrollPass.cpp
进行窥探可能会很有启发性。除此之外,还有像NumCompletelyUnrolled
和NumUnrolled
这样的统计数据可以提供粗略的整体状态。接下来,有一些元数据可以作为提示考虑(搜索GetLoopUnrollMetadata
补充@schaiba写的内容)。传递源文件中要遵循的另一件事是TripCount
以及如何使用它来确定展开循环的确切策略。
PS:我的笔记基于LLVM
3.7源代码树,这就是为什么我在描述中不是很明确的原因。 YMMV取决于您正在处理的版本,但这些内容大部分都在最新的主干(6.0.0)中。