我正在使用 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 代码。