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涉及多个块:
要插入if-then-else,必须将原始基本块拆分为(1)和(4)。条件检查和条件分支进入(1),并且(2)和(3)分支到(4)。在简单的情况下,SplitBlockAndInsertIfThenElse函数(docs)将为您完成此操作。如果您有更复杂的要求(例如then或包含其自己的控制流),则可能需要自己进行拆分。
如果您的then或else块修改了变量,则将需要PHI节点。该万花筒教程解释了为什么需要PHI节点,以及如何使用它们。本教程参考了“ 单个静态分配 Wikipedia”文章,这是有用的背景知识。
| 归档时间: |
|
| 查看次数: |
2326 次 |
| 最近记录: |