LLVM IR 优化

LLVM IR optimization

我正在尝试遵循 this link 以便为 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.reg.bcconst.bc 文件的优化版本。

opt -mem2reg const.bc > const.reg.bc

我在生成这些文件时没有遇到任何问题,但出于某种原因,它们完全相同并且没有进行优化。结果应该不同,我的意思是 const.reg.bc 应该是 const.bc 文件的优化版本。但由于某种原因,它没有发生。谁能告诉我我做错了什么?

当你运行 clang somefile.c时,它默认为-O0优化级别,它发出具有optnone属性的主函数。此属性会阻止优化,这就是为什么您看不到 mem2reg.

的结果的原因

如果您想让 opt 工作,您必须删除 optnone 属性:

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

请注意 mem2reg 及其对应的 reg2mem 遍并非严格优化。他们只是转换 IR from/to SSA 形式。

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