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.bc
的 const.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
属性。
我正在尝试遵循 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.bc
的 const.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
属性。