次のシナリオがあります。
A
/ \
B C
\ /
D
/ \
E F
\ /
...
A,B,C,D,E,F
すべての基本ブロックがある場所|
は、下向きの矢印です。
さて、B
私はいくつかの def を持っているでしょう、例えば%mul = ...
、それは後で対応する左側のブロックで使用されE
ます... = %mul ...
。適切な制御フローが挿入されています。左のブランチのみが取得されるか、右のブランチのみが取得されます。問題はInstruction does not dominate all uses
、検証パスでエラーが発生することです。
PHINode
以下のように指示を追加して、これを修正しようとしました。
B: ; preds = %A
%shl = shl ...
br label %D
C: ; preds = %A
...
br label %D
D: ; preds = %B , %C
...
br i1 %ctrl, label %E, label %F
E: ; preds = %D
%phi_nlcs = phi i32 [ %shl, %extra_l_diff ], [ 0, %for.cond ]
%cmp = icmp slt i32 %phi_nlcs, %1
br label ...
省略記号は、無関係な詳細を隠すためにあります。また、ブロックの名前を変更しましたが、コア ロジックはそこにあるはずです。ご覧のとおり、 の使用を適切な呼び出しに置き換え%shl
ましPHINode
たreplaceAllUsesWith()
。
ただし、次の新しいエラーが表示されるようになりました。
PHINode should have one entry for each predecessor of its parent basic block!
%phi_nlcs = phi i32 [ %shl, %extra_l_diff ], [ 0, %for.cond ]
どうすればこれを修正できますか?