我正在使用 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 的方式会导致这种情况
即使在生成任何 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 级别没有发生其他持续折叠)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)