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

杰古尔斯

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

例如,一条add指令将具有左侧。但是,storebr指令不会。

斯蒂法诺·桑菲利波(Stefano Sanfilippo)

通常,您可以识别那些不能进行结果分配的指令,但是您不能说说一条指令是否会导致赋值,只能说它可能会产生结果

这是因为你不具备分配一个操作的结果。例如,以下代码行在LLVM IR中有效:

add nsw i32 %a, %b

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

出于最后的考虑,您可以假设在实践中,所有可以进行结果分配的指令都将具有一个指令,唯一的例外是callinvoke与极为相似call,因此适用于前者的相同考虑。

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

无法分配结果的指令类:

  • 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; }

  // ...
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何判断机器是否具有PAE?

如何判断#define是否具有值

如何判断类是否具有方法__call__?

如何判断对象是否具有特定的重载方法?

如何判断TF OP是否具有渐变?

如何判断对象是否具有给定的原型?

如何判断地图是否具有默认值?

如何检查 llvm 指令是否在循环内?

同一基本块中的所有LLVM PHI指令是否始终具有相同的传入块集?

如何验证LLVM“ ret”指令是否返回void?

如何判断向量是否具有一定数量的元素C ++

如何判断给定的2D数组在python中是否具有空列

如何判断RAID控制器是否具有真正的硬件RAID而不是假RAID?

如何判断ES6类是否具有给定名称的吸气剂?

如何在编译时判断两个变量是否具有相同的类型?

在SSO之前,如何在html页面中判断用户是否具有活动的Azure会话?

如何判断datetime字符串在PHP中是否具有日期组件

如何判断Windows计算机是否具有64位CPU或操作系统

MongoDB - 在聚合匹配后如何判断每个文档是否具有完全匹配的元素数组

Haskell:中缀(`:`)运算符是否具有左侧标识?

如何判断“内联”是否有效?

如何判断.woff字体是否有提示?

webRTC如何判断是否有音频

使用RMagick判断jpeg是否具有剪切路径

使用本机Javascript判断<input>或<textarea>是否具有焦点

有没有办法判断我的硬件是否支持特定指令?

XSLT-如何判断具有特定属性值的元素是否是匹配系列中的最后一个

是否可以呈现具有独立范围的角度指令模板?

如何判断Linux机器是否支持AVX / AVX2指令?