有没有办法判断LLVM Instruction
是否有左侧?也就是说,它是否产生了价值?
例如,add
指令会有左侧;但是,store
或br
指令不会。
答案 0 :(得分:4)
通常,您可以识别那些不能具有结果分配的指令,但是您不能说某条指令是否会导致分配,只能说可能。< / p>
这是因为您没有 来分配操作的结果。例如,以下代码行在LLVM IR中有效:
add nsw i32 %a, %b
但它没有意义,因为它没有任何效果。没有理智的工具会发出那条线,即使被发射,优化器也会在消除死代码时将其擦掉。忽略返回值的唯一指令实际上是call
。实际上,您可能只想为副作用调用一个函数,即使它没有被声明为void
。想想C中的printf
,其返回值几乎总是被忽略。
由于最后一次考虑,您可以假设实际上所有可以进行结果分配的指令都有一个,唯一的例外是call
。 invoke
与call
非常相似,因此前者的相同注意事项适用。
您可能已经注意到,指令是否导致赋值取决于其类。在llvm/IR/Instruction.def
的帮助下,其中包含所有操作码和类的定义,以及the IR language reference,我们可以提出以下细分:
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
来对指令进行分类:
#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