繁体   English   中英

在LLVM中的两个块之间插入一个块

[英]Inserting a block between two blocks in LLVM

我想在 LLVM 的两个基本块之间插入一个块。 例如,如果一个基本块 A 跳到基本块 B,我想在它们之间插入一个基本块 C,这样 A 跳到 C,C 跳到 B。我该怎么做? 我确实有一个基本的想法,我需要更改基本块 A 的终止指令,以便目标 B 被 C 替换,但是我如何继续在其间添加新的基本块 C?

是的,您需要更改(或替换)基本块 A 的终止指令 - 例如,如果它是一个分支,则可以使用BranchInst::setSuccessor() 然后创建基本块 C 并确保其终止指令跳转到 B,这将使其介于两者之间。

你需要做的就是改变终结者的目标——你不需要重新排列内存中的块顺序或类似的东西。

但是,您必须意识到有两个特殊说明需要您担心 - phi 节点和着陆点。

  • Phi 节点仅指块的直接前驱。 这意味着如果在 A 和 B 之间插入 C,则必须通过删除它们或使它们引用 C 而不是 A 来修复 B 中的所有 phi 节点。

  • 如果 B 是一个着陆板块(包含一个着陆板指令),那么直接从 invoke 指令的展开目标跳转到它是合法的。 如果从 A 跳转到 B 是通过展开目标,则不能在中间添加基本块,除非您将 C 本身设置为着陆场并从 B 上移除着陆场。

有一个名为llvm::splitEdge的函数。 它完全符合问题的要求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM