将LLVM IR转换为更高的优化级别

4

我已经将C代码编译成使用-O0优化的LLVM IR代码。

如何将这个使用-O0优化的LLVM IR代码转换成使用-O3优化的LLVM IR代码,而且不需要原始的C代码呢?

我已经尝试了以下方法:

clang -O3 -S -emit-llvm O0.ll -o O3.ll

并且

opt -O3 -S O0.ll -o O3.ll

但输出仍然是-O0级别。
谢谢。

opt 应该做你期望的事情。你能发一个样例吗?它们是一样的吗? - Frank C.
1
可能是为什么Clang会自动向我的函数添加属性?的重复问题。 - Anton Korobeynikov
1个回答

1
我不确定这个变化是什么时候发生的(我认为是从LLVM 3.9.0开始),但当您编译成位码时,函数会被注释为optnone属性,并且不会执行进一步的优化。
请参阅相关的SO讨论here
建议的做法是这样的:
clang -emit-llvm -O1 -mllvm -disable-llvm-optzns -disable-llvm-passes foo.c -o foo.bc

对于LLVM 3.8.0及更早版本(我认为),你已经做得足够了。因此,一旦你获得了那个位代码(没有optnone参数),你可以像以前一样使用opt。

现在我的求知欲让我想编写一个转换器来删除所有的 optnone 属性,但我认为这样做不会很好看。 - jvstech
哈哈,是的,但我不确定那些情况下使用 optnone 是有原因的。 - compor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接