是否有办法判断LLVM Instruction
是否具有左侧?也就是说,它是否产生价值?
例如,add
指令的左侧;但是,store
或br
指令不会。
通常,您可以识别那些不能具有结果分配的指令,但是您不能说指令是否会导致赋值,只能说它可能。
这是因为您没有have来分配操作结果。例如,以下代码行在LLVM IR中有效:
add nsw i32 %a, %b
但没有意义,因为它没有任何作用。没有理智的工具会发出该行,即使被发出,在消除死代码的过程中,优化程序也会将其抹去。唯一忽略返回值的指令实际上是call
。实际上,即使未声明void
,您也可能只想为副作用而调用函数。考虑一下C中的printf
,其返回值几乎总是被忽略。
由于这最后一个考虑因素,您可以假设在实践中,所有可以进行结果分配的指令都只有一个,但call
除外。 invoke
与call
非常相似,因此适用于前者的相同考虑。
您可能已经注意到,一条指令是否导致赋值取决于其类。借助llvm/IR/Instruction.def
(包含所有操作码和类的定义)和llvm/IR/Instruction.def
,我们可以提出以下细分:
ReturnInst
,BranchInst
,SwitchInst
,IndirectBrInst
,ResumeInst
,UnreachableInst
,CleanupReturnInst
CatchReturnInst
,StoreInst
,FenceInst
,AtomicRMWInst
AtomicCmpXchgInst
CatchSwitchInst
BinaryOperator
,AllocaInst
,LoadInst
GetElementPtrInst
,InvokeInst
CatchSwitchInst
,TruncInst
,ZExtInst
,SExtInst
,FPToUIInst
,FPToSIInst
,UIToFPInst
,SIToFPInst
,FPTruncInst
,FPExtInst
,PtrToIntInst
,IntToPtrInst
] >BitCastInst
VAArgInst
,CleanupPad
CatchPad
,ICmpInst
,FCmpInst
,PHINode
SelectInst
,ExtractElementInst
,ShuffleVectorInst
,ExtractValueInst
,InsertElementInst
InsertValueInst
,CallInst
您现在可以在InvokeInst
的结果上构建switch
,或者更好地在Instruction::getOpcode()
的基础上对指令进行分类:
InstVisitor
您可以检查指令的返回类型是否为InstVisitor
: