LLVM OPT未将优化文件作为输出。
LLVM OPT未将优化文件作为输出。,llvm,llvm-clang,llvm-ir,llvm-c++-api,Llvm,Llvm Clang,Llvm Ir,Llvm C++ Api,opt的手册页说:“它将LLVM源文件作为输入,对其运行指定的优化或分析,然后输出优化文件或分析结果” 我的目标是:使用opt中提供的内置优化通行证-dce。此过程执行死代码消除 我的源文件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. cl
opt
的手册页说:“它将LLVM源文件作为输入,对其运行指定的优化或分析,然后输出优化文件或分析结果”我的目标是:使用
opt
中提供的内置优化通行证-dce
。此过程执行死代码消除我的源文件
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相同 我已经看到了这样的答案,但我并没有得到优化的代码
我是不是遗漏了什么?有人能给我指路吗。
谢谢。如果您查看由clang生成的.ll文件,它将包含一行如下内容:
attributes #0 = { noinline nounwind optnone sspstrong uwtable ...}
您应该在此处删除optnone
属性。每当一个函数具有optnone
属性时,opt
根本不会触及该函数
现在如果你再试一次,你会注意到。。。没有什么。它仍然不起作用
这一次的问题是代码是在内存上工作,而不是在寄存器上工作。我们需要做的是使用
-mem2reg
将alloca
s转换为寄存器。事实上,这样做已经优化了b
,所以你甚至不需要-dce
标志。好的,那么对于任何其他优化选项,比如说-constprop
,我应该使用-mem2reg
作为默认选项吗?@RahulBharadwaj是,许多优化只有在局部变量转换成寄存器后才能起作用。谢谢你的回答,先生。