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

Teresa Johnson via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 14 10:14:03 PDT 2017


Looks like none of the "prof" metadata is documented, and it is only
partially verified. I'll go ahead and add these. Probably the LangRef
first, today, then the verifier as a follow-up with tests in the next day
or so.
Teresa

On Wed, Jun 14, 2017 at 9:59 AM, Teresa Johnson <tejohnson at google.com>
wrote:

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


More information about the llvm-commits mailing list