【问题标题】:Get rid of LLVM's Unconditional Branch摆脱 LLVM 的无条件分支
【发布时间】:2018-02-13 16:50:06
【问题描述】:

考虑这个 IR:

label0:
  ret i32 0   
  br label %1 

如何摆脱无条件分支指令?我已将其类型转换为 BranchInst 类并使用 removeFromParent()eraseFromParent() 但我收到 this 错误。

BranchInst *BI = dyn_cast<BranchInst>(i);
if(BI->isUnconditional())
  BI->removeFromParent();

【问题讨论】:

  • 您应该在问题中包含您看到的错误。
  • 我已经在顶部的 LLVM 错误链接中添加了错误。

标签: clang llvm llvm-ir


【解决方案1】:

首先,有一个 pass/transform 可以消除无条件分支的块。见simplifycfg(条件)和相关的API

但是,通过在示例基本块中以两个终止符指令结束,我认为您可能正在尝试以某种方式转换 IR。

如果您查看 BasicBlock 的文档,它会指出:

一个结构良好的基本块是由一个非终止的列表组成的 指令后跟一条 TerminatorInst 指令。

不清楚你是如何得到那个基本块的,但也许在擦除旧的终结符之后,你可以使用getTerminator 方法;如果返回nullptr,则表示基本块的格式不正确。

不知道你是怎么做的ATM(你显示的代码不够用),但是擦掉旧的终结符后,可以使用ReturnInstCreate()方法,这个变种取了@987654331 @ 作为第二个参数来为您设置新的终止指令。

【讨论】:

  • 得到了解决方案。我正在使用 for 循环迭代基本块以删除额外的分支指令。所以我不能在你的 for 循环的 I++ 部分再次使用它。我必须重组循环,以便在擦除指令之前递增。所以需要 ++I 然后是 BI->dropAllReferences(),最后是 BI->eraseFromParent()。
猜你喜欢
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多