LLVM OPT未将优化文件作为输出。

时间:2018-03-04 05:33:59

标签: 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;
}

这是我做的:
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答案,但我没有得到优化代码。
我在这里错过了什么吗?有人可以指导我走正确的道路 谢谢。

1 个答案:

答案 0 :(得分:3)

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

attributes #0 = { noinline nounwind optnone sspstrong uwtable ...}

您应该在此处删除optnone属性。只要某个函数具有optnone属性,opt就不会触及该函数。

现在如果你再试一次,你会注意到......什么都没有。它仍然无效。

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