実行時にある命令の値をチェックしたい。したがって、私はcompare命令と、 "then"基本ブロックまたは "else"基本ブロックのどちらかに分岐する分岐命令を作成します。しかし、私は、条件付きブランチの後に作成された基本ブロックをどのように挿入できるか、および既存の基本ブロックの分割がどのように機能するかはわかりません。既存の基本ブロックにif/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を既存の基本ブロックの中央に挿入するにはどうすればよいですか?
すべての場合で 'SplitBlockAndInsertIfThenElse'で十分です。両方の新しいブロックのターミネータへのポインタを返します。挿入ポイントとしてこれらのブロックを使用して、必要な制御フローを含め、必要な指示を挿入できます。 –
私は誤解していますか? –
SplitBlockAndInsertIfThenElseによって作成されたthenブロックおよびelseブロックには、終了分岐命令があります。有効な基本ブロックには、その分岐先の分岐命令(制御フロー)が含まれていないか、誤解されていますか? –