假设我的 CFG(以及其他)中有两个基本块 A 和 B,边缘从 A 到 B。我需要执行以下操作:
- 在该边缘上获取一组有效值(它可能是一个过度近似,即它可能包含不再有效的值)
- 将它们中的每一个映射到另一个值(S->S')
- 用映射值 (S') 替换 - 在 B 及其后继者中 - S 中的所有值的使用
LLVM 是否提供了一种简单的方法来完成第一点和第三点(因为我似乎无法找到它)?如果没有,您对如何做有什么建议吗?
注意:交叉发布在 LLVM 邮件列表中
假设我的 CFG(以及其他)中有两个基本块 A 和 B,边缘从 A 到 B。我需要执行以下操作:
LLVM 是否提供了一种简单的方法来完成第一点和第三点(因为我似乎无法找到它)?如果没有,您对如何做有什么建议吗?
注意:交叉发布在 LLVM 邮件列表中
我对您的问题没有明确的答案,但是我想到了要遵循的导演。我希望它能以某种方式帮助你。
首先,我会查看LLVM 程序员手册中的“迭代BasicBlock 中的指令”和“迭代 def-use & use-def 链”。它给出了如何迭代基本块中的指令和该值的用户的想法。
由于您需要了解边缘的生活价值,我会检查“迭代函数中的 BasicBlocks”,并尝试确定用户(在你迭代的 ech 上)的放置位置,例如使用const BasicBlock* llvm::Instruction ::getParent() 常量。
如果用户所在位置的信息不够,您可能想利用 [支配者和后支配者分析],请查看:
这可能会帮助您确定块或指令之间的支配关系,这可能有助于您创建集合。