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