[llvm] r272729 - Set machine block placement hot prob threshold for both static and runtime profile.
Dehao Chen via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 14 22:10:56 PDT 2016
Thanks for fixing this. But I think the current equation is still incorrect
because if ProfileLikelyProb>75, the probability will be > 100%
I thinks the right equation is:
Let's use S to denote Prob(BB->succ), P to denote Prob(BB->pred), L to
denote ProfileLikelyProb
S / (S + P * 2) = L
the new threshold for triangle case = S / (S + P) = L / (2 - L)
With this, when L is 50%, return threshold = 100 / 150
when L is 100% return threshold = 100 / 100
Dehao
On Tue, Jun 14, 2016 at 8:32 PM, Sean Silva <chisophugis at gmail.com> wrote:
> Thanks!
>
> On Tue, Jun 14, 2016 at 8:12 PM, Xinliang David Li <xinliangli at gmail.com>
> wrote:
>
>> Added documentation.
>>
>> I actually overlooked an error in the code review. The patch produces the
>> right threshold by default, but when parameter is set to be non-default,
>> the result is not correct. I have corrected it in this patch.
>>
>> David
>>
>>
>>
>> On Tue, Jun 14, 2016 at 7:11 PM, Sean Silva via llvm-commits <
>> llvm-commits at lists.llvm.org> wrote:
>>
>>>
>>>
>>> On Tue, Jun 14, 2016 at 3:27 PM, Dehao Chen via llvm-commits <
>>> llvm-commits at lists.llvm.org> wrote:
>>>
>>>> Author: dehao
>>>> Date: Tue Jun 14 17:27:17 2016
>>>> New Revision: 272729
>>>>
>>>> URL: http://llvm.org/viewvc/llvm-project?rev=272729&view=rev
>>>> Log:
>>>> Set machine block placement hot prob threshold for both static and
>>>> runtime profile.
>>>>
>>>> Summary: With runtime profile, we have more confidence in branch
>>>> probability, thus during basic block layout, we set a lower hot prob
>>>> threshold so that blocks can be layouted optimally.
>>>>
>>>> Reviewers: djasper, davidxl
>>>>
>>>> Subscribers: llvm-commits
>>>>
>>>> Differential Revision: http://reviews.llvm.org/D20991
>>>>
>>>> Modified:
>>>> llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp
>>>> llvm/trunk/lib/CodeGen/MachineBranchProbabilityInfo.cpp
>>>> llvm/trunk/test/CodeGen/X86/block-placement.ll
>>>>
>>>> Modified: llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp?rev=272729&r1=272728&r2=272729&view=diff
>>>>
>>>> ==============================================================================
>>>> --- llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp (original)
>>>> +++ llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp Tue Jun 14
>>>> 17:27:17 2016
>>>> @@ -125,6 +125,7 @@ BranchFoldPlacement("branch-fold-placeme
>>>> cl::init(true), cl::Hidden);
>>>>
>>>> extern cl::opt<unsigned> StaticLikelyProb;
>>>> +extern cl::opt<unsigned> ProfileLikelyProb;
>>>>
>>>> namespace {
>>>> class BlockChain;
>>>> @@ -520,13 +521,20 @@ bool MachineBlockPlacement::shouldPredBl
>>>> return false;
>>>> }
>>>>
>>>> -// FIXME (PGO handling)
>>>> -// For now this method just returns a fixed threshold. It needs to be
>>>> enhanced
>>>> -// such that BB and Succ is passed in so that CFG shapes are examined
>>>> such that
>>>> -// the threshold is computed with more precise cost model when PGO is
>>>> on.
>>>> -static BranchProbability getLayoutSuccessorProbThreshold() {
>>>> - BranchProbability HotProb(StaticLikelyProb, 100);
>>>> - return HotProb;
>>>> +// When profile is not present, return the StaticLikelyProb.
>>>> +// When profile is available, we need to handle the triangle-shape CFG.
>>>> +static BranchProbability getLayoutSuccessorProbThreshold(
>>>> + MachineBasicBlock *BB) {
>>>> + if (!BB->getParent()->getFunction()->getEntryCount())
>>>> + return BranchProbability(StaticLikelyProb, 100);
>>>> + if (BB->succ_size() == 2) {
>>>> + const MachineBasicBlock *Succ1 = *BB->succ_begin();
>>>> + const MachineBasicBlock *Succ2 = *(BB->succ_begin() + 1);
>>>> + if (Succ1->isSuccessor(Succ2) || Succ2->isSuccessor(Succ1))
>>>> + return BranchProbability(
>>>> + 200 - 2 * ProfileLikelyProb, 200 - ProfileLikelyProb);
>>>>
>>>
>>> Please comment on how these numbers were derived.
>>>
>>>
>>>> + }
>>>> + return BranchProbability(ProfileLikelyProb, 100);
>>>> }
>>>>
>>>> /// Checks to see if the layout candidate block \p Succ has a better
>>>> layout
>>>> @@ -593,7 +601,7 @@ bool MachineBlockPlacement::hasBetterLay
>>>> // edge: Prob(Succ->BB) needs to >= HotProb in order to be selected
>>>> (without
>>>> // profile data).
>>>>
>>>> - BranchProbability HotProb = getLayoutSuccessorProbThreshold();
>>>> + BranchProbability HotProb = getLayoutSuccessorProbThreshold(BB);
>>>>
>>>> // Forward checking. For case 2, SuccProb will be 1.
>>>> if (SuccProb < HotProb) {
>>>>
>>>> Modified: llvm/trunk/lib/CodeGen/MachineBranchProbabilityInfo.cpp
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineBranchProbabilityInfo.cpp?rev=272729&r1=272728&r2=272729&view=diff
>>>>
>>>> ==============================================================================
>>>> --- llvm/trunk/lib/CodeGen/MachineBranchProbabilityInfo.cpp (original)
>>>> +++ llvm/trunk/lib/CodeGen/MachineBranchProbabilityInfo.cpp Tue Jun 14
>>>> 17:27:17 2016
>>>> @@ -29,6 +29,12 @@ cl::opt<unsigned> StaticLikelyProb(
>>>> cl::desc("branch probability threshold to be considered very
>>>> likely"),
>>>> cl::init(80), cl::Hidden);
>>>>
>>>> +cl::opt<unsigned> ProfileLikelyProb(
>>>> + "profile-likely-prob",
>>>> + cl::desc("branch probability threshold to be considered very
>>>> likely "
>>>> + "when profile is available"),
>>>> + cl::init(51), cl::Hidden);
>>>>
>>>
>>> Please mention in the description that this is a percentage.
>>>
>>> -- Sean Silva
>>>
>>>
>>>> +
>>>> char MachineBranchProbabilityInfo::ID = 0;
>>>>
>>>> void MachineBranchProbabilityInfo::anchor() {}
>>>>
>>>> Modified: llvm/trunk/test/CodeGen/X86/block-placement.ll
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/block-placement.ll?rev=272729&r1=272728&r2=272729&view=diff
>>>>
>>>> ==============================================================================
>>>> --- llvm/trunk/test/CodeGen/X86/block-placement.ll (original)
>>>> +++ llvm/trunk/test/CodeGen/X86/block-placement.ll Tue Jun 14 17:27:17
>>>> 2016
>>>> @@ -1207,4 +1207,82 @@ exit:
>>>> ret void
>>>> }
>>>>
>>>> +define void @test_hot_branch_profile(i32* %a) !prof !6 {
>>>> +; Test that a hot branch that has a probability a little larger than
>>>> 60% will
>>>> +; break CFG constrains when doing block placement when profile is
>>>> available.
>>>> +; CHECK-LABEL: test_hot_branch_profile:
>>>> +; CHECK: %entry
>>>> +; CHECK: %then
>>>> +; CHECK: %exit
>>>> +; CHECK: %else
>>>> +
>>>> +entry:
>>>> + %gep1 = getelementptr i32, i32* %a, i32 1
>>>> + %val1 = load i32, i32* %gep1
>>>> + %cond1 = icmp ugt i32 %val1, 1
>>>> + br i1 %cond1, label %then, label %else, !prof !5
>>>> +
>>>> +then:
>>>> + call void @hot_function()
>>>> + br label %exit
>>>> +
>>>> +else:
>>>> + call void @cold_function()
>>>> + br label %exit
>>>> +
>>>> +exit:
>>>> + call void @hot_function()
>>>> + ret void
>>>> +}
>>>> +
>>>> +define void @test_hot_branch_triangle_profile(i32* %a) !prof !6 {
>>>> +; Test that a hot branch that has a probability a little larger than
>>>> 80% will
>>>> +; break triangle shaped CFG constrains when doing block placement if
>>>> profile
>>>> +; is present.
>>>> +; CHECK-LABEL: test_hot_branch_triangle_profile:
>>>> +; CHECK: %entry
>>>> +; CHECK: %exit
>>>> +; CHECK: %then
>>>> +
>>>> +entry:
>>>> + %gep1 = getelementptr i32, i32* %a, i32 1
>>>> + %val1 = load i32, i32* %gep1
>>>> + %cond1 = icmp ugt i32 %val1, 1
>>>> + br i1 %cond1, label %exit, label %then, !prof !5
>>>> +
>>>> +then:
>>>> + call void @hot_function()
>>>> + br label %exit
>>>> +
>>>> +exit:
>>>> + call void @hot_function()
>>>> + ret void
>>>> +}
>>>> +
>>>> +define void @test_hot_branch_triangle_profile_topology(i32* %a) !prof
>>>> !6 {
>>>> +; Test that a hot branch that has a probability between 50% and 66%
>>>> will not
>>>> +; break triangle shaped CFG constrains when doing block placement if
>>>> profile
>>>> +; is present.
>>>> +; CHECK-LABEL: test_hot_branch_triangle_profile_topology:
>>>> +; CHECK: %entry
>>>> +; CHECK: %then
>>>> +; CHECK: %exit
>>>> +
>>>> +entry:
>>>> + %gep1 = getelementptr i32, i32* %a, i32 1
>>>> + %val1 = load i32, i32* %gep1
>>>> + %cond1 = icmp ugt i32 %val1, 1
>>>> + br i1 %cond1, label %exit, label %then, !prof !7
>>>> +
>>>> +then:
>>>> + call void @hot_function()
>>>> + br label %exit
>>>> +
>>>> +exit:
>>>> + call void @hot_function()
>>>> + ret void
>>>> +}
>>>> +
>>>> !5 = !{!"branch_weights", i32 84, i32 16}
>>>> +!6 = !{!"function_entry_count", i32 10}
>>>> +!7 = !{!"branch_weights", i32 60, i32 40}
>>>>
>>>>
>>>> _______________________________________________
>>>> llvm-commits mailing list
>>>> llvm-commits at lists.llvm.org
>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>>>
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160614/37e6ecfe/attachment.html>
More information about the llvm-commits
mailing list