[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