基本ブロックで phi ノードを使用する場合、前任者が特定のブロックである可能性が高い場合にラベルを配置する推奨順序はありますか。たとえば、以下にリストされている単純な階乗関数を取り上げます。
define private i64 @fact(i64 %start) {
entry:
%0 = icmp sle i64 1, %start
br i1 %0, label %loop, label %endcond
loop: ; preds = %loop, %entry
%1 = phi i64 [ %res, %loop ], [ 1, %entry ] ; if %start > 2 predecessor
%2 = phi i64 [ %3, %loop ], [ %start, %entry ] ; is likely %loop
%res = mul i64 %1, %2
%3 = sub i64 %2, 1
%cond = icmp sle i64 1, %3
br i1 %cond, label %loop, label %endcond
endcond: ; preds = %loop, %entry
%fin = phi i64 [ %res, %loop ], [ 1, %entry ] ; highly unlikely
ret i64 %fin ; predecessor is %entry
}
ユーザーが入力@fact(1)
する可能性はありますが、可能性は低いため、ほとんどの場合、ファイ ノードの先行ブロックendcond
はpost.loop
. この場合、私の仮定はそうです
%fin = phi i64 [ %res, %post.loop ], [ 1, %entry ]
よりも良い
%fin = phi i64 [ 1, %entry ], [ %res, %post.loop ]
正しい?もしそうなら、それはなぜですか?