如何生成无优化的LLVM IR 关闭IRBuilder自动指令合并优化
问题原因
你遇到的现象不是后续优化Pass导致的,是IRBuilder在生成IR阶段默认开启的常量表达式折叠逻辑:当GEP的基址、所有索引都是常量时,IRBuilder默认会把它折叠成常量表达式直接嵌入到后续指令的操作数中,不会生成独立的getelementptr指令。你关闭后续Pass优化自然不会生效,因为折叠行为发生在IR生成阶段。
解决方法
有两种常用方案可以禁用这类自动折叠:
使用无折叠的IRBuilder实例
把你当前的IRBuilder声明替换为带NoFolder策略的版本,即可完全禁用IRBuilder的常量折叠逻辑:// 替换原来的IRBuilder声明,原有构造参数保持不变 llvm::IRBuilder<llvm::NoFolder> m_builder(...);该模式下所有
CreateXXX调用都会生成独立的指令,不会做常量折叠。手动创建并插入GEP指令
如果你不想修改全局IRBuilder的折叠策略,可以跳过CreateGEP接口,手动构造GEP指令后插入到当前插入点:std::vector<llvm::Value*> indices(2, llvm::ConstantInt::get(llvm::Type::Int256Ty, 0)); llvm::GetElementPtrInst *gepInst = llvm::GetElementPtrInst::Create( llvm::Type::getInt256Ty(m_builder.getContext()), // 元素类型 conArray, // 基址 indices, "spPtr" ); m_builder.Insert(gepInst); // 插入到当前插入点 m_builder.CreateStore(llvm::ConstantInt::get(llvm::Type::Int256Ty, 0), gepInst);手动构造的指令不会触发IRBuilder的常量折叠逻辑,一定会生成独立的命名寄存器指令。
两种方案都可以得到你预期的两条独立IR指令。
内容的提问来源于stack exchange,提问作者Kenun
相关产品推荐
相关产品推荐

