error: Invalid instruction with no BB
2021-10-01
Tech自作言語の開発中、LLVMが以下のメッセージを吐いて死ぬのを調査したメモ。
./bin/llvm-dis: error: Invalid instruction with no BB (Producer: 'LLVM12.0.1' Reader: 'LLVM 12.0.1')
このメッセージで検索すると lib/Bitcode/Reader/BitcodeReader.cpp がヒット
if (!CurBB) {
I->deleteValue();
return error("Invalid instruction with no BB");
}
CurBBがnullになるのは?
// If this was a terminator instruction, move to the next block.
if (I->isTerminator()) {
++CurBBNo;
CurBB = CurBBNo < FunctionBBs.size() ? FunctionBBs[CurBBNo] : nullptr;
}
終端命令が来たときらしい。デバッグログを足してみる
if (I->isTerminator()) {
dbgs() << "[term] " << I->getOpcodeName() << "\n";
[term] ret
[term] br
[term] br
[term] br
[term] br
(中略)
[term] br
[term] br
[term] br
[term] br
[term] unreachable
ret、br、unreachableとかが終端命令らしい。そういえば.llに
call void %func69(%Int* %sk_int62, %String* %sk_str63)
%"::Void" = load %Void*, %Void** @"::Void", align 8
unreachable
"Invoke_Object#p71": ; preds = %MatchEnd
%addr_vtable72 = getelementptr inbounds %Object, %Object* %main, i32 0, i32 0
%vtable73 = load i8*, i8** %addr_vtable72, align 8
%vtable_ptr74 = bitcast i8* %vtable73 to [16 x i8*]*
みたいな箇所があったな。.ll上では正しく見えるが、.bcの方でこのgetelementptrがベーシックブロックに入ってないのかも…(そうであれば.ll吐くときにエラーにしてほしいが)
と思ったが
いろいろやってるうちにここがまずい気がしてきた。
"Invoke_Object#p_end42": ; preds = %"Invoke_Object#p34"
br label %MatchEnd
br label %MatchClause2_
なんでこうなってるのか
- MatchEndへ飛ぶのは、「パターンがマッチしたとき」
- MatchClause2_へ飛ぶのは、「パターンがマッチしなかったとき」
なので、何か変だ。
コードを見返したところ、build_unconditional_branchを多く呼びすぎていたことがわかった。修正したらこのエラーはなくなった。