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

Philip Reames via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 14 09:46:03 PDT 2017


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 <mailto: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
>         <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
>         <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/Instruction.cpp?rev=302209&r1=302208&r2=302209&view=diff
>         <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Instruction.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().equals("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<ConstantInt>(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<ConstantInt>(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/Transforms/Inline/prof-update.ll?rev=302209&r1=302208&r2=302209&view=diff
>         <http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/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 <mailto:llvm-commits at lists.llvm.org>
>         http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>         <http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits>
>
>
>
>     _______________________________________________
>     llvm-commits mailing list
>     llvm-commits at lists.llvm.org <mailto:llvm-commits at lists.llvm.org>
>     http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>     <http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits>
>
>
>
>
> -- 
> Teresa Johnson | 	 Software Engineer | 	tejohnson at google.com 
> <mailto:tejohnson at google.com> | 	 408-460-2413
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170614/1ef555ac/attachment.html>


More information about the llvm-commits mailing list