C++ LLVM-删除死代码的活性分析
我正在尝试实现活动性分析,以删除死掉的指令。我知道存在C++ LLVM-删除死代码的活性分析,c++,llvm,compiler-optimization,dead-code,C++,Llvm,Compiler Optimization,Dead Code,我正在尝试实现活动性分析,以删除死掉的指令。我知道存在IsInstructionTritiallyDead(),但是,我想学习如何使用def use(或use def)链删除代码 我目前的做法是迭代一个块中的所有指令(使用inst_iterator),并对每个指令循环其所有用途。最后,如果一个指令没有用,那么我认为它已经死了,因此可以使用 EraseOfPAREN()/ < /P>删除它。 这看起来像: for (inst_iterator I = inst_begin(F), E = inst
IsInstructionTritiallyDead()
,但是,我想学习如何使用def use(或use def)链删除代码
我目前的做法是迭代一个块中的所有指令(使用inst_iterator
),并对每个指令循环其所有用途。最后,如果一个指令没有用,那么我认为它已经死了,因此可以使用<代码> EraseOfPAREN()/<代码> < /P>删除它。
这看起来像:
for (inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I) {
bool deadInst = true;
Instruction *inst = &*I;
for (User* pUser : inst->users()) {
// If we enter this loop, we have at least one use, so instruction isn't dead
deadInst = false;
}
// deadInst is true if we didn't enter the loop, so has no uses
if (deadInst) {
inst->eraseFromParent();
}
}
问题是,返回指令没有与之相关的用途(我确信还有其他没有用途的定义)。但是,不应删除返回指令,因为它将导致语义错误的代码
我通过活性分析删除指令的一般方法可以吗?如何确保退货等指示不被删除
任何指针都非常受欢迎:)还要检查指令是否是终止符指令(
inst->isTerminator()
)您提到的llvm::IsInstructionLittlelyDead
,这是了解哪些指令可以删除,哪些指令不能删除的好开始
您已经注意到无法删除终止符指令
此外,您不希望删除没有任何用途但有副作用的指令。考虑这一点:
define void @bar()() {
call void @foo()()
ret void
}
您不希望删除call
指令,即使它没有任何用途,因为它可以写入标准输出或更改某些全局变量。同样的事情也适用于商店
。检查说明::可能有副作用
了解完整列表
您的活动性分析过于激进:不需要任何用途,但不是将指令视为死亡的充分条件
如果您不想使用<代码> ISTERATION DELATION 学习,我建议您开始另一种方式:考虑指令何时死时(例如,<代码> ALLACA <代码>在没有使用时死掉,所以<代码> Addio>代码>……然后泛化。
此外,简单地循环所有指令并删除无效指令是不够的。例如:%2 = add i32 3, %1
%3 = add i32 3, %2
当你第一次遇到
%2
时,它在%3
中有一个用途,所以它不是死的。但是当你把%3
消除为死亡后,%2
也会死亡。您可以通过迭代直到找不到新的死指令(无效但简单)或通过某种递归过程来克服此问题。Hi。谢谢你的回复。你能对此提供更多的见解吗?你的意思是像if(deadInst&&!inst->isTerminator())
?什么是终结者函数?嗨。谢谢你的回复。我能否在我的if(deadInst)
条件中使用isTerminator()
或maybhavesideeffects()
等条件来抵消活性分析的攻击性?也就是说,我们可以假设,如果变量没有用途,不是终止符指令,并且没有副作用,那么删除它也是一样的。或者这仍然太激进了?@user3186023,添加到列表中,我认为这就足够开始了,但是llvm
也尝试用调试信息保存指令,您可能想保留,也可能不想保留。啊,登陆板-我对它了解很少!我在IsInstructionTritiallyDead()
的源代码中看到了这一点,但我无法理解它的作用,也找不到任何文档。是否有任何LLVM文档可以解释什么是着陆垫?抱歉-出于一些奇怪的原因,我的手机上没有超链接到着陆垫文档的链接,因此您没有提供链接。我会通读的,非常感谢!我希望通过这3项新检查,我的活动性分析不会太过激进,也不会太过需要移动指令。@user3186023,这里有一个关于着陆垫工作原理的详细解释:。