如何在没有优化的情况下生成 LLVM IR
How to generate LLVM IR without optimization
我正在编写一个 LLVM PASS 来分析寄存器中的信息。似乎 IRBuilder
自动优化了我的代码,使表达式成为操作数。例如,我写下下面的代码来生成 LLVM IR。
// %reg = getelementptr inbounds ([128 x i256], [128 x i256]* @mstk, i256 0, i256 0
std::vector<llvm::Value*> indices(2, llvm::ConstantInt::get(Type::Int256Ty, 0));
llvm::ArrayRef<llvm::Value *> indicesRef(indices);
llvm::Value* m_sp = m_builder.CreateGEP(conArray, indicesRef, "spPtr");
// store 0, *%m_sp
m_builder.CreateStore(llvm::ConstantInt::get(Type::Int256Ty, 0), m_sp);
预期的IR应该由两个寄存器组成。 (见下文)
%reg = getelementptr inbounds ([128 x i256], [128 x i256]* @mstk, i256 0, i256 0)
store i256 0, i256* reg
不幸的是,IRBuilder 通过合并寄存器来优化 IR。
store i256 0, i256* getelementptr inbounds ([128 x i256], [128 x i256]* @mstk, i256 0, i256 0)
是否可以禁用 IR 优化? 我已确定已关闭所有 PASS。谢谢
我通过禁用 IR builder 的常量文件夹解决了这个问题。参见 Disable constant folding for LLVM 10 C++ API
我正在编写一个 LLVM PASS 来分析寄存器中的信息。似乎 IRBuilder
自动优化了我的代码,使表达式成为操作数。例如,我写下下面的代码来生成 LLVM IR。
// %reg = getelementptr inbounds ([128 x i256], [128 x i256]* @mstk, i256 0, i256 0
std::vector<llvm::Value*> indices(2, llvm::ConstantInt::get(Type::Int256Ty, 0));
llvm::ArrayRef<llvm::Value *> indicesRef(indices);
llvm::Value* m_sp = m_builder.CreateGEP(conArray, indicesRef, "spPtr");
// store 0, *%m_sp
m_builder.CreateStore(llvm::ConstantInt::get(Type::Int256Ty, 0), m_sp);
预期的IR应该由两个寄存器组成。 (见下文)
%reg = getelementptr inbounds ([128 x i256], [128 x i256]* @mstk, i256 0, i256 0)
store i256 0, i256* reg
不幸的是,IRBuilder 通过合并寄存器来优化 IR。
store i256 0, i256* getelementptr inbounds ([128 x i256], [128 x i256]* @mstk, i256 0, i256 0)
是否可以禁用 IR 优化? 我已确定已关闭所有 PASS。谢谢
我通过禁用 IR builder 的常量文件夹解决了这个问题。参见 Disable constant folding for LLVM 10 C++ API