【问题标题】:LLVM IR optimizationLLVM IR 优化
【发布时间】:2019-02-23 04:02:36
【问题描述】:

我正在尝试关注 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.reg.bcconst.bc 文件的优化版本。

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      请注意mem2reg 及其对应的reg2mem 通道并未严格优化。他们只是将 IR 从/转换为 SSA 表单。

      【讨论】:

      • 谢谢@arrowd。然而,在下面的第 17 页,他们使用我在此处提出的相同命令对其进行了优化。为什么我的优化器和他们的有差异?当我输出文本 IR 时,我的和他们的不同。我的IR优化版和非优化版基本一样。虽然对他们来说是不同的。我的意思是,在他们的文本 IR 中,实际上发生了优化。 laure.gonnord.org/pro/research/ER03_2015/lab1_intro.pdf
      • 啊,我明白了。 clang 默认为 -O0 优化级别,它发出带有 optnone 属性的 main 函数。在文本编辑器中编辑 const.ll 文件并从 attributes #0 枚举中删除 optnone 关键字。之后mem2reg申请成功。
      • 谢谢@arrowd。有没有办法避免这种情况而不必通过文件并删除关键字?另外,请编辑您上面的回复,以便我将其标记为已解决。
      • 您可以使用sed
      猜你喜欢
      • 2021-02-22
      • 1970-01-01
      • 2013-07-28
      • 2018-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      • 1970-01-01
      相关资源
      最近更新 更多