-loop-unroll是否通过强制LLVM来展开循环?

时间:2017-11-27 03:28:09

标签: c++ c compiler-construction llvm compiler-optimization

我有一段代码,我希望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还是更多的"提示"编译器可以选择忽略吗?

1 个答案:

答案 0 :(得分:1)

  

此命令是否保证所有循环都将由a展开   因子3?

简短的回答是否定的。

首先,它取决于循环。例如,如果它是指针追逐循环,那么这是一个主要的抑制因素。展开的决定因素是能够在编译时计算行程计数。因此,循环展开的主要帮助是执行indvars传递。

围绕LoopUnroll.cppLoopUnrollPass.cpp进行窥探可能会很有启发性。除此之外,还有像NumCompletelyUnrolledNumUnrolled这样的统计数据可以提供粗略的整体状态。接下来,有一些元数据可以作为提示考虑(搜索GetLoopUnrollMetadata补充@schaiba写的内容)。传递源文件中要遵循的另一件事是TripCount以及如何使用它来确定展开循环的确切策略。

PS:我的笔记基于LLVM 3.7源代码树,这就是为什么我在描述中不是很明确的原因。 YMMV取决于您正在处理的版本,但这些内容大部分都在最新的主干(6.0.0)中。