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,这里有一个关于着陆垫工作原理的详细解释:。