【问题标题】:Disable constant folding for LLVM 10 C++ API禁用 LLVM 10 C++ API 的常量折叠
【发布时间】:2020-12-11 05:00:01
【问题描述】:

我正在使用 LLVM C++ API 为 C 语言的子集编写编译器前端。我注意到生成的 IR 始终应用了恒定折叠优化。但我想禁用它并获得一个忠实的、未优化的 IR。有没有办法做到这一点?

以下是我使用模块生成 IR 的代码。

    llvm::verifyModule(kit.module, &llvm::outs());
    kit.module.print(llvm::outs(), nullptr);
    auto tirFile = "output.ir";
    error_code ec;
    llvm::raw_fd_ostream tirFileStream(tirFile, ec, llvm::sys::fs::F_None);
    kit.module.print(tirFileStream, nullptr);
    tirFileStream.flush();

好像我使用的 LLVM 版本是 LLVM 10。

sumit@HAL9001:~$ llvm-config --version
10.0.0

例如,当我在以下 C 函数上运行编译器时

int arith() {
  return (10 - 10/3) << 3 | (23+8*12) & 1024;
}

编译成

define i32 @arith() {
entry:
  ret i32 56
}

对常量的二元运算由编译器自己评估,即常量折叠;它没有被翻译成适当的 IR 代码。

【问题讨论】:

  • 该代码不应该更改 IR。打印只是打印,AFAICT。但是你总是可以设置一个断点。查看 ConstantFolding.cpp 中的函数,找到您怀疑被调用的函数,设置断点,运行代码并在命中断点时查看堆栈。
  • 这不会改变 IR 本身,但生成的 IR 具有内置的恒定折叠。我已编辑问题并添加了一个示例。
  • 您在前端使用 IRBuilder?您可以自己创建指令,这很简单。大多数 IRBuilder 方法都是四参数包装器,围绕称为 SomethingInst::Create() 的四参数方法。有些更复杂,例如创建一个加法是 if(all args constant) { part you don't want } else { BinaryOperation::Create(...}; }
  • @arnt 我明白了,所以他们的 IRBuilder 实现会进行常量折叠。所以没有直接的方法来禁用它,我认为它更像是一个自动应用的优化过程。谢谢你告诉我。
  • 没有删除 IRBuilder 是不可能的。但是删除 IRBuilder 一点也不复杂。

标签: c++ c compiler-construction llvm constantfolding


【解决方案1】:

引用this link:

前端将代码降低到 IR 的方式导致了这种 甚至在任何 LLVM IR 生成之前都会发生持续折叠。 本质上,当你进行 AST 遍历时,你将 基本上看下面的代码得到运行:

IRBuilder<> Builder; Value *LHS = Builder.getInt32(2); 
Value *RHS = Builder.getInt32(4); // LHS and RHS are ConstantInt values because they’re constant expressions.
Value *Res = Builder.CreateMul(LHS,RHS); // Because LHS and RHS are constant values, the IRBuilder folds this to a constant expression.

无法关闭此常量折叠。 (我也假设有 在 Clang AST 级别没有其他常量折叠)。

【讨论】:

  • 我确实看到了邮件列表线程,但我认为这正是 Clang 实现它的方式,并且在 API 级别会有更大的灵活性。但正如@arnt 在对该问题的评论中指出的那样,它确实是 IRBuilder 代码中内置的东西。谢谢!
【解决方案2】:

在 LLVM 11 中,您可以使用 IRBuilder&lt;llvm::NoFolder&gt; 而不是 IRBuilder&lt;&gt;

我很确定它也适用于 LLVM 10(尽管我尚未验证)。

别忘了#include #include &lt;llvm/IR/NoFolder.h&gt; :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 2014-05-02
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多