You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何添加的LLVM指令未出现在编译后的二进制文件中?

LLVM ModulePass添加指令消失问题解决办法

你的判断没错,新增的指令确实大概率被LLVM的**死代码消除(DCE)**优化移除了。问题核心在于:你生成的neg和add指令结果(op1、op2)没有被任何后续指令引用,属于无副作用、无价值的死代码,LLVM优化流程会自动清理这类指令。

下面是几种可行的解决思路:

一、让新指令的结果被现有逻辑引用

修改原有二进制指令的操作数,让它依赖你新增的指令结果,这样新指令就会成为有效代码的一部分,不会被DCE删除。示例代码调整如下:

for (BasicBlock& bb : F)
{
    for (BasicBlock::iterator it = bb.begin(), it_end = bb.end(); it != it_end; ++it)
    {
        if (!it->isBinaryOp())
            continue;

        BinaryOperator* binOp = cast<BinaryOperator>(&*it);
        // 添加测试指令
        Value* op1 = BinaryOperator::CreateNeg(binOp->getOperand(0), "neg", binOp);
        Value* op2 = BinaryOperator::Create(Instruction::Add, op1, binOp->getOperand(1), "cre", binOp);
        // 让原二进制指令使用新指令的结果,替代原有操作数
        binOp->setOperand(0, op2);
    }
}

二、关闭优化(仅用于调试验证)

如果只是验证指令是否成功添加,不想修改原有业务逻辑,可以编译时关闭所有优化,跳过DCE流程:

# 用-O0关闭所有优化编译
clang.exe -mwindows -O0 tiny.c -o tiny.exe

或者单独用opt工具运行你的Pass,再无优化生成二进制:

# 生成原始LLVM IR
clang.exe -mwindows -S -emit-llvm tiny.c -o tiny.ll
# 运行自定义ModulePass
opt -load your-pass.so -your-pass-name < tiny.ll > modified.ll
# 无优化生成目标文件和二进制
llc -filetype=obj modified.ll -o modified.o
clang.exe -mwindows modified.o -o tiny.exe

三、给指令标记副作用(不推荐用于生产)

LLVM不会移除带有副作用的指令,你可以手动给新增指令添加副作用标记,但这属于调试hack,不适合真实业务场景:

// 给op2标记副作用,避免被DCE删除
cast<Instruction>(op2)->setHasSideEffects(true);

内容的提问来源于stack exchange,提问作者m00nic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 23:05:05