[llvm] r302209 - Update VP prof metadata during inlining.
Teresa Johnson via llvm-commits
llvm-commits at lists.llvm.org
Fri May 19 21:27:46 PDT 2017
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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170519/cdcc347c/attachment.html>
More information about the llvm-commits
mailing list