[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