Clang: 怎么看loop flattening pass的效果?

Clang: how to see the effect of loop flattening pass?

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的效果?使用哪些选项?

更新。我在 Windows.

上使用 clang 版本 12.0.0

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

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