如何判断LLVM指令是否为左手边

时间:2016-01-18 22:50:24

标签: llvm llvm-ir

有没有办法判断LLVM Instruction是否有左侧?也就是说,它是否产生了价值?

例如,add指令会有左侧;但是,storebr指令不会。

2 个答案:

答案 0 :(得分:4)

通常,您可以识别那些不能具有结果分配的指令,但是您不能说某条指令是否会导致分配,只能说可能。< / p>

这是因为您没有 来分配操作的结果。例如,以下代码行在LLVM IR中有效:

add nsw i32 %a, %b

但它没有意义,因为它没有任何效果。没有理智的工具会发出那条线,即使被发射,优化器也会在消除死代码时将其擦掉。忽略返回值的唯一指令实际上是call。实际上,您可能只想为副作用调用一个函数,即使它没有被声明为void。想想C中的printf,其返回值几乎总是被忽略。

由于最后一次考虑,您可以假设实际上所有可以进行结果分配的指令都有一个,唯一的例外是callinvokecall非常相似,因此前者的相同注意事项适用。

您可能已经注意到,指令是否导致赋值取决于其类。在llvm/IR/Instruction.def的帮助下,其中包含所有操作码和类的定义,以及the IR language reference,我们可以提出以下细分:

无法进行结果分配的指令类:

  • ReturnInstBranchInstSwitchInstIndirectBrInstResumeInstUnreachableInstCleanupReturnInstCatchReturnInst
  • StoreInstFenceInstAtomicRMWInstAtomicCmpXchgInst

(可能)具有结果分配的指令类:

  • CatchSwitchInst
  • BinaryOperator
  • AllocaInstLoadInstGetElementPtrInst
  • InvokeInstCatchSwitchInst
  • TruncInstZExtInstSExtInstFPToUIInstFPToSIInstUIToFPInstSIToFPInstFPTruncInstFPExtInstPtrToIntInstIntToPtrInstBitCastInst
  • VAArgInst
  • CleanupPadCatchPad
  • ICmpInstFCmpInstPHINodeSelectInst
  • ExtractElementInstShuffleVectorInstExtractValueInstInsertElementInstInsertValueInst

可能有也可能没有结果分配的指令类:

  • CallInstInvokeInst

您现在可以在switch的结果上构建Instruction::getOpcode(),或者更好的是InstVisitor来对指令进行分类:

#include <llvm/IR/InstVisitor.h>

enum HaveRetVal { DEFINITELY_NOT, MAYBE, PROBABLY_YES };

class HaveRetAssignment : public InstVisitor<HaveRetAssignment, HaveRetVal> {
public:
  HaveRetVal visitBinaryOperator(BinaryOperator &) { return PROBABLY_YES; }

  // ...

  HaveRetVal visitCallInst(CallInst&) { return MAYBE; }

  // ...

  HaveRetVal visitBranchInst(BranchInst&) { return DEFINITELY_NOT; }

  // ...
};

答案 1 :(得分:2)

您可以检查指令的返回类型是否为df %>% group_by(Name) %>% arrange(Date) %>% summarise(last(creditscore)-first(creditscore))

void