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

use*_*312 2 llvm llvm-ir llvm-c++-api

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

Instruction* someInst;
IRBuilder<> B(someInst);

Value* condition = B.CreateICmp(CmpInst::ICMP_UGT, someInst, someValue);

BasicBlock* thenBB = BasicBlock::Create(*ctx, "then");
BasicBlock* elseBB = BasicBlock::Create(*ctx, "else");

B.CreateCondBr(condition, thenBB, elseBB);

B.SetInsertPoint(thenBB);
//insert stuff

B.SetInsertPoint(elseBB);
//insert stuff
Run Code Online (Sandbox Code Playgroud)

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

小智 5

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

根据Wikipedia的基本介绍

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

因此,if-then-else涉及多个块:

  1. 包含条件的块,
  2. 然后块
  3. else块
  4. (可选)在then和else块之后的块(如果then and else不返回或分支到其他地方)。

要插入if-then-else,必须将原始基本块拆分为(1)和(4)。条件检查和条件分支进入(1),并且(2)和(3)分支到(4)。在简单的情况下,SplitBlockAndInsertIfThenElse函数(docs)将为您完成此操作。如果您有更复杂的要求(例如then或包含其自己的控制流),则可能需要自己进行拆分。

如果您的then或else块修改了变量,则将需要PHI节点。该万花筒教程解释了为什么需要PHI节点,以及如何使用它们。本教程参考了“ 单个静态分配 Wikipedia”文章,这是有用的背景知识。