【问题标题】:Does the -loop-unroll pass force LLVM to unroll loops?-loop-unroll 传递是否强制 LLVM 展开循环?
【发布时间】:2017-11-27 03:28:09
【问题描述】:

我有一段代码,我希望 LLVM 按某个因素展开其中的所有循环。我正在使用以下命令:

opt -mem2reg -simplifycfg -loops -lcssa -loop-simplify -loop-rotate -loop-unroll -unroll-count=3 -unroll-allow-partial -debug TrainingCode/trainingCode.ll -o TrainingCode/unrolledTrainingCode.bc

具体来说,-loop-unroll-unroll-count=3 处理循环展开的东西 - 其余的只是转换代码,以便 LLVM 可以展开代码。

此命令是否保证所有循环都将展开 3 倍?或者它更像是在 GCC 中使用 pragma 语句,如果编译器认为不是最佳的,它可以选择忽略?换句话说,-loop-unroll-unroll-count=3 是否传递强制编译器使用 3 的展开因子,或者它更像是编译器可以选择忽略的“提示”?

【问题讨论】:

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


    【解决方案1】:

    此命令是否保证所有循环都将由 3倍?

    简短的回答是否定的。

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

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

    PS:我的笔记是基于LLVM 3.7 源代码树,所以我在描述中不是很明确。 YMMV 取决于您正在使用的版本,但这些内容大多存在于最新的主干 (6.0.0) 中。

    【讨论】:

      【解决方案2】:

      据我所知,循环展开是 translated#pragmas 。如果在编译时不知道展开计数,则不会进行展开。如果你选择完全展开,这意味着 LLVM 确实会消除循环。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-08
        • 2014-11-10
        • 1970-01-01
        • 2012-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多