[llvm] r272729 - Set machine block placement hot prob threshold for both static and runtime profile.

Sean Silva via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 14 20:32:06 PDT 2016


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/e1cea12b/attachment.html>


More information about the llvm-commits mailing list