LLVM IR优化

时间:2019-02-23 04:02:37

标签: llvm compiler-optimization llvm-ir register-allocation

我正在尝试跟踪this链接,以便为c代码生成IR表示。我正在使用的c代码如下

void main() {
 int c1 = 17;
 int c2 = 25;
 int c3 = c1 + c2;
 printf("Value = %d\n", c3);
}

我将其另存为const.c。保存后,我将使用以下命令来生成.bc文件。

clang -c -emit-llvm const.c -o const.bc


生成.bc文件后,我想使用以下命令来生成名为const.bc的{​​{1}}文件的优化版本。

const.reg.bc

生成这些文件没有任何问题,但是由于某些原因,它们完全相同,并且没有优化。结果应该有所不同,我的意思是opt -mem2reg const.bc > const.reg.bc 应该是const.reg.bc文件的优化版本。但是由于某种原因,它不会发生。有人可以告诉我我做错了什么吗?

2 个答案:

答案 0 :(得分:1)

运行clang somefile.c时,它默认为-O0优化级别,它将发出带有optnone属性的主要功能。此属性阻止优化,这就是为什么您看不到mem2reg的结果的原因。

如果您想使optnone起作用,则必须删除opt属性:

clang -S -emit-llvm const.c -o - | sed s/optnone// | opt -S -mem2reg

请注意,mem2reg及其对应的reg2mem通行证并未严格优化。他们只是将IR从SSA形式转换为SSA形式。

答案 1 :(得分:0)

此选项可与clang -Xclang -disable-O0-optnone一起使用,以防止生成optnone属性。