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;
}
这是我做的:
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相同
我已经看过this SO答案,但我没有得到优化的代码。 我在这里错过了什么吗?有人可以指导我走正确的道路。 谢谢。
如果查看clang生成的.ll文件,它将包含如下所示的行:
attributes #0 = { noinline nounwind optnone sspstrong uwtable ...}
你应该在这里删除optnone
属性。每当函数具有optnone
属性时,opt
根本不会触及该函数。
现在,如果你再试一次,你会注意到......没有。它仍然无法正常工作。
这次问题是代码正在处理内存,而不是寄存器。我们需要做的是使用alloca
将-mem2reg
s转换为寄存器。事实上这样做已经优化了b
,所以你甚至不需要-dce
旗。