1

基本ブロックで 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)する可能性はありますが、可能性は低いため、ほとんどの場合、ファイ ノードの先行ブロックendcondpost.loop. この場合、私の仮定はそうです

%fin = phi i64 [ %res, %post.loop ], [ 1, %entry ]

よりも良い

%fin = phi i64 [ 1, %entry ], [ %res, %post.loop ]

正しい?もしそうなら、それはなぜですか?

4

1 に答える 1

1

違いはありません。LLVM はコードを分析して分岐確率を推定し、それを使用して結果のブロックを並べ替えます。

枝の重みのメタデータを使用してこれに影響を与えることができます: http://llvm.org/docs/BlockFrequencyTerminology.html

于 2015-10-08T00:10:36.597 に答える