【问题标题】:Clang: how to see the effect of loop flattening pass?Clang:如何查看loop flattening pass的效果?
【发布时间】:2021-10-24 22:00:44
【问题描述】:

Clang 有 loop flattening pass 从嵌套循环转换:

 for (int i = 0; i < N; ++i)
   for (int j = 0; j < M; ++j)
     f(A[i*M+j]);

进入一个循环:

 for (int i = 0; i < (N*M); ++i)
   f(A[i]);

但是,我找不到如何启用此循环展平通道。 我尝试使用-Os -S,但是,clang 仍然会生成嵌套循环。

问题:如何查看loop flattening pass的效果?使用哪些选项?

UPD。我在 Windows 上使用 clang 版本 12.0.0。

【问题讨论】:

    标签: loops clang llvm compiler-optimization flatten


    【解决方案1】:

    LoopFlatten 自 12.0.0 起已合并到 LLVM。确保您使用的是更新版本。

    第二,在转换过程中,不能直接用clang选项编译。使用opt 使用密码中指定的选项使用LoopFlatten 进行转换传递。如果您对opt不熟悉,请参考这里:opt - LLVM optimizer

    【讨论】:

    • 找不到“优化输出文件”的格式是什么?查看“优化输出文件”的内容,我发现这是一个二进制文件。但是,以哪种格式?补充:如何获取汇编代码文件(就像我们使用clang -S一样)?
    • 您能否(如果可能)指出源文件(和行号),它实现了触发循环展平的条件?看看这些条件会很有趣。这种情况的例子(我想):“如果索引可以是恒定折叠的并且如果索引没有进一步单独使用(所以这些索引可以被自动递增替换)”,等等。
    • @pmor 我不确定 opt 不能直接输出转换后的 bc 代码。但是你绝对可以从 getAnalysis 类中得到分析结果,请看这里:LoopInfo Analysis
    猜你喜欢
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    相关资源
    最近更新 更多