LLVM将if / else插入现有基本块

时间:2016-10-28 21:06:49

标签: llvm llvm-ir llvm-c++-api

我想在运行时检查某些指令的值。因此,我创建了一个比较指令和一个分支指令,它分支到“then”基本块或“else”基本块。但是,我不确定如何在条件分支之后插入创建的基本块以及如何分割现有的基本块。

{{1}}

如何在现有基本块的中间插入if / else?

2 个答案:

答案 0 :(得分:4)

简短回答:您可以使用llvm::SplitBlockAndInsertIfThenElse。不要忘记您的PHI节点。

根据维基百科,basic block

  

是一个直线代码序列,除了条目外没有分支,除了在出口处没有分支。

if-then-else因此涉及几个块:

  1. 包含条件的块
  2. 然后阻止
  3. 其他块
  4. 可选地,在then和else之后的块阻塞(如果那样,否则不返回或在其他地方分支)。
  5. 要插入if-then-else,必须将原始基本块拆分为(1)和(4)。条件检查和条件分支进入(1),并且(2)和(3)以分支到(4)结束。在简单的情况下,SplitBlockAndInsertIfThenElse函数(docs)将为您执行此操作。如果你有更复杂的要求 - 比如当时或者包含他们自己的控制流 - 你可能需要自己进行拆分。

    如果你的then或else块修改变量,你将需要一个PHI节点。 Kaleidoscope tutorial解释了为什么需要PHI节点以及如何使用它们。本教程引用了Single Static Assignment维基百科文章,这篇文章很有用。

答案 1 :(得分:1)

您可以使用名为llvm::SplitBlockAndInsertIfThenElse的辅助函数。您需要#include "llvm/Transforms/Utils/BasicBlockUtils.h"