llvm后端中“无法获取无法访问的MBB的标签”的原因是什么?

时间:2019-07-17 01:18:28

标签: llvm-clang llvm-ir

我正在写一个llvm后端,遇到分支条件指令的问题。

我想将llvm IR分支转换为我的特定目标。以下是我尝试过的。

这是llvm ir

  %6 = icmp slt i32 %4, %5
  br i1 %6, label %7, label %14

我已经定义了指令和指令模式,并编写了比较指令和模式:


  def BNE: InstToy<4, (outs), (ins GPR32:$Rd,btargetS15:$S15), "bne\t$Rd, $S15", [(brcond GPR32:$Rd, bb:$S15)]> {
    bits<15> S15;
    bits<5>  Rd;  
    let Inst{19-5} = S15;
    let Inst{4-0} = Rd;
  }

BNE指令是检查Rd为零,如果不是,则将跳转到目标pc,否则请注意。 我将等速设置为“法律”

  setOperationAction(ISD::BRCOND, MVT::i32, Legal);

但是一旦我尝试使用命令编译llvm ir

llc test.ll

它将引发错误:

llc: MachineBasicBlock.cpp:59: llvm::MCSymbol* llvm::MachineBasicBlock::getSymbol() const: Assertion `getNumber() >= 0 && "cannot get label for unreachable MBB"' failed.

我希望它可以毫无例外地进行编译。

1 个答案:

答案 0 :(得分:0)

在llc上使用-print-after-all,我发现分支折叠通过后MBB消失了,我发现analyticsBranch中存在错误,修复后,问题已解决。