3

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

4

2 回答 2

4

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

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

但是,您必须知道,您需要担心两个特殊指令 - phi 节点和着陆台。

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

  • 如果 B 是一个landingpad 块(包含一个landingpad 指令),只有从invoke 指令的展开目标直接跳转到它才是合法的。如果从 A 到 B 的跳跃是通过展开目标,则不能在中间添加基本块,除非您将 C 本身变成一个着陆区并从 B 上移除着陆区。

于 2012-11-08T07:37:52.890 回答
0

有一个函数叫做llvm::splitEdge. 它完全符合问题的要求。

于 2017-04-08T22:34:25.280 回答