3

次のシナリオがあります。

       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ましPHINodereplaceAllUsesWith()

ただし、次の新しいエラーが表示されるようになりました。

PHINode should have one entry for each predecessor of its parent basic block! 
%phi_nlcs = phi i32 [ %shl, %extra_l_diff ], [ 0, %for.cond ]

どうすればこれを修正できますか?

4

1 に答える 1