如何判断LLVM指令是否具有左侧

问题描述 投票:3回答:2

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

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

llvm llvm-ir
2个回答
6
投票

通常,您可以识别那些不能具有结果分配的指令,但是您不能说指令是否会导致赋值,只能说它可能

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

add nsw i32 %a, %b

但没有意义,因为它没有任何作用。没有理智的工具会发出该行,即使被发出,在消除死代码的过程中,优化程序也会将其抹去。唯一忽略返回值的指令实际上是call。实际上,即使未声明void,您也可能只想为副作用而调用函数。考虑一下C中的printf,其返回值几乎总是被忽略。

由于这最后一个考虑因素,您可以假设在实践中,所有可以进行结果分配的指令都只有一个,但call除外。 invokecall非常相似,因此适用于前者的相同考虑。

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

不能进行结果分配的指令类:

  • [the IR language referenceReturnInstBranchInstSwitchInstIndirectBrInstResumeInstUnreachableInstCleanupReturnInst
  • CatchReturnInstStoreInstFenceInstAtomicRMWInst

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

  • AtomicCmpXchgInst
  • CatchSwitchInst
  • BinaryOperatorAllocaInstLoadInst
  • [GetElementPtrInstInvokeInst
  • CatchSwitchInstTruncInstZExtInstSExtInstFPToUIInstFPToSIInstUIToFPInstSIToFPInstFPTruncInstFPExtInstPtrToIntInstIntToPtrInst] >
  • BitCastInst
  • [VAArgInstCleanupPad
  • CatchPadICmpInstFCmpInstPHINode
  • [SelectInstExtractElementInstShuffleVectorInstExtractValueInstInsertElementInst
  • 可能有结果赋值的指令类:

  • [InsertValueInstCallInst
  • 您现在可以在InvokeInst的结果上构建switch,或者更好地在Instruction::getOpcode()的基础上对指令进行分类:

InstVisitor

5
投票

您可以检查指令的返回类型是否为InstVisitor

© www.soinside.com 2019 - 2024. All rights reserved.