我试图关注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
文件的优化版本,该文件名为const.reg.bc
。
opt -mem2reg const.bc > const.reg.bc
我没有任何问题生成这些文件,但由于某些原因它们都完全相同,没有优化发生。结果应该是不同的,我的意思是const.reg.bc
应该是const.bc
文件的优化版本。但由于某种原因,它不会发生。有人能告诉我,我做得对吗?
当你运行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形式。
此选项可与clang -Xclang -disable-O0-optnone
一起使用,以防止生成optnone
属性。