2015-10-07 13 views
0

При использовании phi-узла в базовом блоке есть предлагаемый порядок, в котором я должен поместить метки, если существует более высокая вероятность того, что предшественник является определенным блоком. Например, возьмите простую факториальную функцию, указанную ниже.Положение LLVM IR метки предшественника в инструкции phi node

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 ] 

правильно? И если да, то почему или почему нет?

ответ

1

Не имеет значения. LLVM проведет анализ вашего кода для оценки вероятности ветвления, и он использует это для упорядочения полученного блока.

Вы можете влиять на это, используя метаданные ветви вес: http://llvm.org/docs/BlockFrequencyTerminology.html

+0

Спасибо! Фантастический ответ! Следующая ссылка на [Отраслевые весовые метаданные] (http://llvm.org/docs/BranchWeightMetadata.html), которые я нашел на ссылке, которую вы дали, также была очень информативной –