gpt4 book ai didi

c++ - 在 LLVM 中启用循环反转的任何选项?

转载 作者:行者123 更新时间:2023-12-05 05:29:50 27 4
gpt4 key购买 nike

是否有启用循环反转的选项?更具体地说,LLVM 能否将 while 形式循环转换为 do-while 形式循环,如下所示。

改造前代码为:

void foo(unsigned a, unsigned& ret) {
bool undone = true;
#pragma unroll 4
while((a > 0) && undone) {
++ret;
if(ret > 2) undone = false;
if(undone) --a;
}
}

改造后的代码为:

void foo(unsigned a, unsigned& ret) {
bool undone = true;
#pragma unroll 4
if((a > 0) && undone) {
do {
++ret;
if(ret > 2) undone = false;
if(undone) --a;
while((a > 0) && undone);
}
}

我使用了 opt pass 并启用了 loop-rotate 选项和 loop-simplify 选项。但是没有实现循环逆变换。

最佳答案

LLVM 使用 Clang 在 -O2 中使用的标准优化管道(以及大多数其他基于 LLVM 的前端)使用的标准优化管道完全按照您的要求进行转换。所以你的问题的直接答案是“-O2”。这不是一次通过,因为您需要启用协同工作的完整优化管道来完成此任务。

要查看所有这些操作,让我们在编译器资源管理器中查看您使用 Clang v15 的示例代码(固定版本,因此行号是稳定的): https://cpp.compiler-explorer.com/z/o73nEP6r5

在汇编的第 3 行和 LLVM IR 的第 9 行,您将看到一个条件分支。此分支在循环之外,并且精确对应于您想要的结果中的 if((a > 0) && undone) 条件。此时,undone 是常量 (true),因此折叠起来,条件分支仅在进入循环之前检查 a > 0 .同样,这个条件在循环的外部并且永远不会被重新访问。

在此之下,您将在程序集输出中看到这一行:

.LBB0_2:                                # =>This Inner Loop Header: Depth=1

这个标签标记了一个基本的机器代码块,最后的注释来自LLVM的循环分析,表明这是“循环头”[1],实际循环代码的最上面的基本 block ,它对应于 do { 在您想要的转换中开始的位置。

作为Nick Lewyckycomments 中指出,执行您描述的特定转换的特定 LLVM 传递是“循环旋转”,我同意他的评论,即它是您所描述内容的超集。但是,您不能单独启用它。要查看 LLVM 如何构建一组运行良好的循环传递,请查看此处的管道和它前面的 大量 代码主体,该代码主体安排所有其他相关转换:https://github.com/llvm/llvm-project/blob/main/llvm/lib/Passes/PassBuilderPipelines.cpp#L531,L609

关于c++ - 在 LLVM 中启用循环反转的任何选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74833845/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com