gpt4 book ai didi

LLVM 将 if/else 插入现有的基本 block

转载 作者:行者123 更新时间:2023-12-04 12:13:42 27 4
gpt4 key购买 nike

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

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

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

最佳答案

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

根据维基百科,basic block :

is a straight-line code sequence with no branches in except to the entry and no branches out except at the exit.



因此,if-then-else 涉及几个块:
  • 包含条件
  • 的块
  • 然后块
  • else 块
  • 可选地, then 和 else 块之后的块(如果 then 和 else 不返回或在其他地方分支)。

  • 要插入 if-then-else,必须将原始基本块拆分为 (1) 和 (4)。条件检查和条件分支进入(1),(2)和(3)以分支到(4)结束。 SplitBlockAndInsertIfThenElse函数 ( docs ) 会在简单的情况下为你做这件事。如果您有更复杂的需求 - 例如 then 或其他包含自己的控制流 - 您可能需要自己进行拆分。

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

    关于LLVM 将 if/else 插入现有的基本 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40313222/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com