我正在写一个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.
我希望它可以毫无例外地进行编译。
答案 0 :(得分:0)
在llc上使用-print-after-all,我发现分支折叠通过后MBB消失了,我发现analyticsBranch中存在错误,修复后,问题已解决。