LLVM红外优化

LLVM红外优化,llvm,compiler-optimization,llvm-ir,register-allocation,Llvm,Compiler Optimization,Llvm Ir,Register Allocation,我试图通过链接为c代码生成一个IR表示。我使用的c代码如下 我把它保存为const.c。保存后,我使用以下命令生成一个.bc文件 生成.bc文件后,我想使用以下命令生成名为const.reg.bc的const.bc文件的优化版本 我在生成这些文件时没有遇到任何问题,但由于某些原因,它们完全相同,没有进行优化。结果应该不同,我的意思是const.reg.bc应该是const.bc文件的优化版本。但由于某种原因,它没有发生。有人能告诉我我做得不对的地方是什么吗?当运行clang somefile.

我试图通过链接为c代码生成一个IR表示。我使用的c代码如下

我把它保存为const.c。保存后,我使用以下命令生成一个.bc文件

生成.bc文件后,我想使用以下命令生成名为const.reg.bc的const.bc文件的优化版本

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

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

如果要选择执行工作,则必须删除optnone属性:

clang -S -emit-llvm const.c -o - | sed s/optnone// | opt -S -mem2reg
注意:mem2reg及其对应的reg2mem过程并没有严格优化。他们只是将IR从/转换为SSA表单。

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

如果要选择执行工作,则必须删除optnone属性:

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

注意:mem2reg及其对应的reg2mem过程并没有严格优化。他们只是将IR从/转换为SSA表单。

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

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

谢谢@arrowd。但是在接下来的第17页,他们使用我在这里发布的相同命令对其进行了优化。为什么我的优化器和他们的优化器之间存在差异?当我输出文本IR时,我的与他们的不同。我的IR的优化版本和非优化版本基本相同。而对他们来说,情况就不同了。我的意思是,在他们的文本IR中,优化实际上发生了。啊,我明白了。clang默认为-O0优化级别,该级别发出带有optnone属性的主函数。在文本编辑器中编辑const.ll文件,并从属性0枚举中删除optnone关键字。之后,mem2reg成功应用。谢谢@arrowd。有没有一种方法可以避免这种情况,而不必遍历文件并删除关键字?另外,请编辑上面的回复,以便我将其标记为已解决。您可以使用sed。谢谢@arrowd。但是在接下来的第17页,他们使用我在这里发布的相同命令对其进行了优化。为什么我的优化器和他们的优化器之间存在差异?当我输出文本IR时,我的与他们的不同。我的IR的优化版本和非优化版本基本相同。而对他们来说,情况就不同了。我的意思是,在他们的文本IR中,优化实际上发生了。啊,我明白了。clang默认为-O0优化级别,该级别发出带有optnone属性的主函数。在文本编辑器中编辑const.ll文件,并从属性0枚举中删除optnone关键字。之后,mem2reg成功应用。谢谢@arrowd。有没有一种方法可以避免这种情况,而不必遍历文件并删除关键字?另外,请编辑上面的回复,以便我将其标记为已解决。您可以使用sed。
opt -mem2reg const.bc > const.reg.bc
clang -S -emit-llvm const.c -o - | sed s/optnone// | opt -S -mem2reg