LLVM OPT 不提供优化文件作为输出。

Rah*_*waj 3 llvm llvm-clang llvm-ir llvm-c++-api

手册页opt说:“它将 LLVM 源文件作为输入,运行指定的优化或分析,然后输出优化的文件或分析结果”。

我的目标:要使用内置的优化过程-dce中可用opt。这个通行证Dead Code Elimination

我的源文件foo.c

int foo(void)
 {
   int a = 24;
   int b = 25; /* Assignment to dead variable -- dead code */
   int c;
   c = a * 4;
   return c;
}
Run Code Online (Sandbox Code Playgroud)

这是我所做的:
1. clang-7.0 -S -emit-llvm foo.c -o foo.ll
2.opt -dce -S foo.ll -o fooOpt.ll

我期望的是:一个 .ll 文件,其中消除了死代码(在带有注释的源代码中)部分。

我得到的是:fooOpt.ll 与非优化代码 foo.ll 相同

我已经看过这个SO 答案,但我没有得到优化的代码。
我在这里错过了什么吗?有人可以指导我走正确的道路。
谢谢你。

sep*_*p2k 7

如果您查看由 clang 生成的 .ll 文件,它将包含如下一行:

attributes #0 = { noinline nounwind optnone sspstrong uwtable ...}
Run Code Online (Sandbox Code Playgroud)

您应该在optnone此处删除该属性。每当一个函数具有该optnone属性时,opt就根本不会触及该函数。

现在,如果您再试一次,您会注意到……什么也没有。它仍然不起作用。

这次的问题是代码在内存上工作,而不是在寄存器上。我们需要做的是使用 .s 将allocas转换为寄存器-mem2reg。事实上,这样做已经优化了b,所以你甚至不需要-dce标志。

  • @RahulBharadwaj 是的,许多优化只有在局部变量转换为寄存器后才会起作用。 (3认同)