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

时间:2012-11-07 18:09:53

标签: c++ c compiler-construction llvm

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

2 个答案:

答案 0 :(得分:3)

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

您需要做的就是更改终结器的目标 - 您不需要重新排列内存中的块顺序或类似的内容。

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

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

  • 如果B是一个登陆板块(包含一个登陆板指令),直接从调用指令的展开目标跳转到它是合法的。如果从A到B的跳转是通过展开目标,则除非将C本身放入登录牌并从B中删除登录牌,否则无法在中间添加基本块。

答案 1 :(得分:0)

There is a function called llvm::splitEdge. It does exactly what the question asked for.