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是,许多优化只有在局部变量转换成寄存器后才能起作用。谢谢你的回答,先生。