phi 节点指令中前驱块标签的 LLVM IR 位置
LLVM IR position of predecessor block labels in phi node instruction
当在基本块中使用 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
中的 phi 节点的前导块是 post.loop
。我的假设也是如此
%fin = phi i64 [ %res, %post.loop ], [ 1, %entry ]
优于
%fin = phi i64 [ 1, %entry ], [ %res, %post.loop ]
正确吗?如果是,为什么或为什么不?
没有区别。 LLVM 将对您的代码进行分析以估计分支概率,并使用它来对生成的块进行排序。
您可以通过使用分支权重元数据来影响这一点:http://llvm.org/docs/BlockFrequencyTerminology.html
当在基本块中使用 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
中的 phi 节点的前导块是 post.loop
。我的假设也是如此
%fin = phi i64 [ %res, %post.loop ], [ 1, %entry ]
优于
%fin = phi i64 [ 1, %entry ], [ %res, %post.loop ]
正确吗?如果是,为什么或为什么不?
没有区别。 LLVM 将对您的代码进行分析以估计分支概率,并使用它来对生成的块进行排序。
您可以通过使用分支权重元数据来影响这一点:http://llvm.org/docs/BlockFrequencyTerminology.html