我想知道如何在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,但它会出现段错误 最后一次迭代)
答案 0 :(得分:0)
构建循环的方式使内部代码尝试删除无效的迭代器:it == it_end
。 if (it == it_end) continue;
之后的简单it++
会有所帮助。
不确定如何构建LLVM迭代,但对于stl容器,erase
将返回递增的迭代器,因此您甚至不需要奇怪的循环。简要介绍docs似乎证实了这一点。