删除一堆llvm指令

时间:2017-06-08 15:28:27

标签: llvm instructions

我想知道如何在LLVM中删除一堆指令。 我尝试了以下内容(基于llvm-dev邮件列表中的帖子)

// delete all instructions between [start,end)

void deleteAllInstructionsInRange(Instruction* startInst,Instruction* endInst)
{
    BasicBlock::iterator it(startInst);
    BasicBlock::iterator it_end(endInst);
    it_end--;

    Instruction* currentInst ;

    while(it != it_end )
    {
        currentInst = &*it;

       // this cannot be done at the end of the while loop.
       // has to be incremented before "erasing" the instruction
        ++it;

        if (!currentInst->use_empty())
        {   
            currentInst->replaceAllUsesWith(UndefValue::get(currentInst->getType()));
        }

        currentInst->eraseFromParent();


    }

}

除最后一次迭代外,一切都按预期工作。 谁知道为什么? (我尝试过使用gdb,但它会出现段错误 最后一次迭代)

1 个答案:

答案 0 :(得分:0)

构建循环的方式使内部代码尝试删除无效的迭代器:it == it_endif (it == it_end) continue;之后的简单it++会有所帮助。

不确定如何构建LLVM迭代,但对于stl容器,erase将返回递增的迭代器,因此您甚至不需要奇怪的循环。简要介绍docs似乎证实了这一点。