首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >禁用llvm10 C++ API的常量折叠

禁用llvm10 C++ API的常量折叠
EN

Stack Overflow用户
提问于 2020-12-11 13:00:02
回答 2查看 255关注 0票数 1

我正在使用LLVM为C语言的一个子集编写一个编译器前端。我注意到生成的IR总是应用常量折叠优化。但我想禁用它,并得到一个忠实的,未经优化的IR。有没有办法做到这一点?

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

代码语言:javascript
复制
    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版本似乎是LLVM10。

代码语言:javascript
复制
sumit@HAL9001:~$ llvm-config --version
10.0.0

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

代码语言:javascript
复制
int arith() {
  return (10 - 10/3) << 3 | (23+8*12) & 1024;
}

它被编译成

代码语言:javascript
复制
define i32 @arith() {
entry:
  ret i32 56
}

对常量的二进制操作由编译器本身进行计算,即常量合并;它不会被转换为适当的IR代码。

EN

回答 2

Stack Overflow用户

发布于 2020-12-11 16:17:53

引用this link

前端将代码降低到IR的方式会导致这种常量折叠甚至在任何LLVM生成之前就会发生。本质上,当您执行AST遍历时,您实际上将看到以下代码得到运行:

代码语言:javascript
复制
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级别上不会发生其他持续的折叠)。

票数 1
EN

Stack Overflow用户

发布于 2021-04-12 03:32:25

在LLVM11中,您可以使用IRBuilder<llvm::NoFolder>而不是IRBuilder<>

我非常确定它也适用于LLVM10(尽管我还没有验证过)。

别忘了#include #include <llvm/IR/NoFolder.h> :)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65246019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档