从LLVM IR中清除基本块中的第一条指令?
我有followint LLVM IR文件从LLVM IR中清除基本块中的第一条指令?
%1 = load i32* %i, align 4
%2 = load i32* %j, align 4
%3 = icmp sgt i32 %1, %2
br i1 %3, label %4, label %6
; <label>:4 ; preds = %0
%5 = load i32* %i, align 4
store i32 %5, i32* %k, align 4
br label %6
; <label>:6 ; preds = %5, %0
ret i32 0
在它我第一加载vairable%1和变量 “j” 以%2则 “i” 的我比较大于条件为(i> j)的。基于该分支要么标签4或标签6.我的问题是有两个加载指令为变量“我”一个在第一个基本块和其他在第二个基本块。这里我想删除第二个加载指令。 对此我这样做,因为当我达到第二个加载指令的变量“我”我第二条指令的第一条指令代替了所有用途,然后我删除当前的指令,即第二条。在这里我无法设置指令迭代器指针。我不想为下一条指令设置(存储i32%5,i32 *%k,对齐4)。有其他方法吗? 如果你知道,请让我知道。
如果我正确地理解了你,你只需要擦除一条指令并不断迭代代码。如果这是正确的,看看这个例子从DeadInstElimintation
通(其居lib/Transforms/Scalar/DCE.cpp
):
virtual bool runOnBasicBlock(BasicBlock &BB) {
bool Changed = false;
for (BasicBlock::iterator DI = BB.begin(); DI != BB.end();) {
Instruction *Inst = DI++;
if (isInstructionTriviallyDead(Inst)) {
Inst->eraseFromParent();
Changed = true;
++DIEEliminated;
}
}
return Changed;
}
有趣的事情要注意的是迭代器是如何递增。 DI++
不是在for
的最后一个条款内部完成的,而是分开的,当前的DI
分配给Inst
。这确保即使删除了Inst
,DI
也已经指向下一条指令,因此循环将继续在下一条指令上运行。
我从CAFxX得到了一个解决方案。感谢你也为你提供帮助。 – damrudhard 2012-03-14 13:16:24
@damrudhard:将新迭代器设置为'BB-> begin()'只有在新指令是基本块中的第一个时才会起作用。否则,你会回到几条指示。如果这对你没问题,那就没问题。不过,我认为我的答案中显示的解决方案更通用。 – 2012-03-14 13:34:42
在其他情况下,我将指令迭代器设置为前一条指令,以便在下一次迭代中指向刚刚删除指令后的指令 。 – damrudhard 2012-03-14 14:19:45
不知道我理解你的问题。但我很确定后续的传球应该能够轻松地将你的负荷移除,所以我不会真的打扰。如果您有一个令人信服的理由来删除负载,请重新提出您的问题,因为我无法理解您的问题究竟是什么。 – CAFxX 2012-03-14 05:53:53
我的问题是,删除第二个加载指令后,我想设置指令迭代器,以便在下一次迭代中它应该达到(存储i32%5,i32 *%k,align 4),因为在for循环中,我正在递增指令迭代器。 – damrudhard 2012-03-14 10:04:51
为什么不直接在'inst-> eraseFromParent()'之后调用'BB-> begin()'来获得新的迭代器呢? – CAFxX 2012-03-14 10:58:59