[llvm] r302209 - Update VP prof metadata during inlining.

Teresa Johnson via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 14 09:59:37 PDT 2017


I guess the author is no longer active in LLVM. +davidxl, we can have
someone here add it.
Teresa

On Wed, Jun 14, 2017 at 9:46 AM, Philip Reames <listmail at philipreames.com>
wrote:

> Teresa, Dehao,
>
> It's been a couple of weeks and this new metadata extension still has not
> been added to the LangRef or the verifier.  This needs immediate attention.
>
> I would like to build off this work but am unclear on the semantics of the
> new metadata.  The lack of documentation/verification is actively blocking
> me from forward progress.
>
> Philip
>
>
> On 05/19/2017 09:27 PM, Teresa Johnson wrote:
>
> Hi Philip,
>
> I was just looking back at this commit and saw your question. It is Value
> Profile metadata (e.g. for indirect call profiling) and was introduced in
> https://reviews.llvm.org/D8940.
>
> Teresa
>
> On Fri, May 5, 2017 at 6:05 PM, Philip Reames via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Sorry, I think I'm coming into something late here.  What exactly is VP
>> metadata?  I have not seen this before and it does not appear to be
>> documented in the LangRef.  The latter is a major problem which needs fixed
>> ASAP.
>>
>> Can you give a pointer where the review thread this was introduced in?
>>
>> Philip
>>
>>
>> On 05/04/2017 05:47 PM, Dehao Chen via llvm-commits wrote:
>>
>>> Author: dehao
>>> Date: Thu May  4 19:47:34 2017
>>> New Revision: 302209
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=302209&view=rev
>>> Log:
>>> Update VP prof metadata during inlining.
>>>
>>> Summary: r298270 added profile update logic for branch_weights. This
>>> patch implements profile update logic for VP prof metadata too.
>>>
>>> Reviewers: eraman, tejohnson, davidxl
>>>
>>> Reviewed By: eraman
>>>
>>> Subscribers: llvm-commits
>>>
>>> Differential Revision: https://reviews.llvm.org/D32773
>>>
>>> Modified:
>>>      llvm/trunk/lib/IR/Instruction.cpp
>>>      llvm/trunk/test/Transforms/Inline/prof-update.ll
>>>
>>> Modified: llvm/trunk/lib/IR/Instruction.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Instru
>>> ction.cpp?rev=302209&r1=302208&r2=302209&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/lib/IR/Instruction.cpp (original)
>>> +++ llvm/trunk/lib/IR/Instruction.cpp Thu May  4 19:47:34 2017
>>> @@ -625,20 +625,41 @@ void Instruction::updateProfWeight(uint6
>>>       return;
>>>       auto *ProfDataName = dyn_cast<MDString>(ProfileData
>>> ->getOperand(0));
>>> -  if (!ProfDataName || !ProfDataName->getString().equ
>>> als("branch_weights"))
>>> +  if (!ProfDataName || (!ProfDataName->getString().equals("branch_weights")
>>> &&
>>> +                        !ProfDataName->getString().equals("VP")))
>>>       return;
>>>   -  SmallVector<uint32_t, 4> Weights;
>>> -  for (unsigned i = 1; i < ProfileData->getNumOperands(); i++) {
>>> -    // Using APInt::div may be expensive, but most cases should fit in
>>> 64 bits.
>>> -    APInt Val(128, mdconst::dyn_extract<ConstantI
>>> nt>(ProfileData->getOperand(i))
>>> -                       ->getValue()
>>> -                       .getZExtValue());
>>> -    Val *= APInt(128, S);
>>> -    Weights.push_back(Val.udiv(APInt(128, T)).getLimitedValue());
>>> -  }
>>>     MDBuilder MDB(getContext());
>>> -  setMetadata(LLVMContext::MD_prof, MDB.createBranchWeights(Weights));
>>> +  SmallVector<Metadata *, 3> Vals;
>>> +  Vals.push_back(ProfileData->getOperand(0));
>>> +  APInt APS(128, S), APT(128, T);
>>> +  if (ProfDataName->getString().equals("branch_weights"))
>>> +    for (unsigned i = 1; i < ProfileData->getNumOperands(); i++) {
>>> +      // Using APInt::div may be expensive, but most cases should fit
>>> 64 bits.
>>> +      APInt Val(128,
>>> +                mdconst::dyn_extract<ConstantI
>>> nt>(ProfileData->getOperand(i))
>>> +                    ->getValue()
>>> +                    .getZExtValue());
>>> +      Val *= APS;
>>> +      Vals.push_back(MDB.createConstant(
>>> +          ConstantInt::get(Type::getInt64Ty(getContext()),
>>> +                           Val.udiv(APT).getLimitedValue())));
>>> +    }
>>> +  else if (ProfDataName->getString().equals("VP"))
>>> +    for (unsigned i = 1; i < ProfileData->getNumOperands(); i += 2) {
>>> +      // The first value is the key of the value profile, which will
>>> not change.
>>> +      Vals.push_back(ProfileData->getOperand(i));
>>> +      // Using APInt::div may be expensive, but most cases should fit
>>> 64 bits.
>>> +      APInt Val(128,
>>> +                mdconst::dyn_extract<ConstantInt>(ProfileData->getOperand(i
>>> + 1))
>>> +                    ->getValue()
>>> +                    .getZExtValue());
>>> +      Val *= APS;
>>> +      Vals.push_back(MDB.createConstant(
>>> +          ConstantInt::get(Type::getInt64Ty(getContext()),
>>> +                           Val.udiv(APT).getLimitedValue())));
>>> +    }
>>> +  setMetadata(LLVMContext::MD_prof, MDNode::get(getContext(), Vals));
>>>   }
>>>     void Instruction::setProfWeight(uint64_t W) {
>>>
>>> Modified: llvm/trunk/test/Transforms/Inline/prof-update.ll
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transfor
>>> ms/Inline/prof-update.ll?rev=302209&r1=302208&r2=302209&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/test/Transforms/Inline/prof-update.ll (original)
>>> +++ llvm/trunk/test/Transforms/Inline/prof-update.ll Thu May  4
>>> 19:47:34 2017
>>> @@ -3,6 +3,7 @@
>>>     declare void @ext();
>>>   declare void @ext1();
>>> + at func = global void ()* null
>>>     ; CHECK: define void @callee(i32 %n) !prof ![[ENTRY_COUNT:[0-9]*]]
>>>   define void  @callee(i32 %n) !prof !1 {
>>> @@ -17,12 +18,16 @@ cond_false:
>>>   ; ext is cloned and updated.
>>>   ; CHECK: call void @ext(), !prof ![[COUNT_CALLEE:[0-9]*]]
>>>     call void @ext(), !prof !2
>>> +  %f = load void ()*, void ()** @func
>>> +; CHECK: call void %f(), !prof ![[COUNT_IND_CALLEE:[0-9]*]]
>>> +  call void %f(), !prof !4
>>>     ret void
>>>   }
>>>     ; CHECK: define void @caller()
>>>   define void @caller() {
>>>   ; CHECK: call void @ext(), !prof ![[COUNT_CALLER:[0-9]*]]
>>> +; CHECK: call void %f.i(), !prof ![[COUNT_IND_CALLER:[0-9]*]]
>>>     call void @callee(i32 15), !prof !3
>>>     ret void
>>>   }
>>> @@ -32,8 +37,11 @@ define void @caller() {
>>>   !1 = !{!"function_entry_count", i64 1000}
>>>   !2 = !{!"branch_weights", i64 2000}
>>>   !3 = !{!"branch_weights", i64 400}
>>> +!4 = !{!"VP", i32 0, i64 140, i64 111, i64 80, i64 222, i64 40, i64
>>> 333, i64 20}
>>>   attributes #0 = { alwaysinline }
>>>   ; CHECK: ![[ENTRY_COUNT]] = !{!"function_entry_count", i64 600}
>>>   ; CHECK: ![[COUNT_CALLEE1]] = !{!"branch_weights", i64 2000}
>>> -; CHECK: ![[COUNT_CALLEE]] = !{!"branch_weights", i32 1200}
>>> -; CHECK: ![[COUNT_CALLER]] = !{!"branch_weights", i32 800}
>>> +; CHECK: ![[COUNT_CALLEE]] = !{!"branch_weights", i64 1200}
>>> +; CHECK: ![[COUNT_IND_CALLEE]] = !{!"VP", i32 0, i64 84, i64 111, i64
>>> 48, i64 222, i64 24, i64 333, i64 12}
>>> +; CHECK: ![[COUNT_CALLER]] = !{!"branch_weights", i64 800}
>>> +; CHECK: ![[COUNT_IND_CALLER]] = !{!"VP", i32 0, i64 56, i64 111, i64
>>> 32, i64 222, i64 16, i64 333, i64 8}
>>>
>>>
>>> _______________________________________________
>>> 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
>>
>
>
>
> --
> Teresa Johnson |  Software Engineer |  tejohnson at google.com |
> 408-460-2413 <(408)%20460-2413>
>
>
>


-- 
Teresa Johnson |  Software Engineer |  tejohnson at google.com |  408-460-2413
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170614/4eecb694/attachment.html>


More information about the llvm-commits mailing list