diff options
-rw-r--r-- | llvm/include/llvm/ProfileData/InstrProf.h | 7 | ||||
-rw-r--r-- | llvm/lib/ProfileData/InstrProf.cpp | 7 | ||||
-rw-r--r-- | llvm/unittests/ProfileData/InstrProfTest.cpp | 20 |
3 files changed, 34 insertions, 0 deletions
diff --git a/llvm/include/llvm/ProfileData/InstrProf.h b/llvm/include/llvm/ProfileData/InstrProf.h index 0cc7d3aa623..9b5ebd0892f 100644 --- a/llvm/include/llvm/ProfileData/InstrProf.h +++ b/llvm/include/llvm/ProfileData/InstrProf.h @@ -219,6 +219,13 @@ void annotateValueSite(Module &M, Instruction &Inst, const InstrProfRecord &InstrProfR, InstrProfValueKind ValueKind, uint32_t SiteIndx, uint32_t MaxMDCount = 3); +/// Same as the above interface but using the ValueData array directly, as +/// well as \p Sum. +void annotateValueSite(Module &M, Instruction &Inst, + const InstrProfValueData VD[], uint32_t NV, + uint64_t Sum, InstrProfValueKind ValueKind, + uint32_t MaxMDCount); + /// Extract the value profile data from \p Inst which is annotated with /// value profile meta data. Return false if there is no value data annotated, /// otherwise return true. diff --git a/llvm/lib/ProfileData/InstrProf.cpp b/llvm/lib/ProfileData/InstrProf.cpp index 972e9e81704..e7e6753f9b3 100644 --- a/llvm/lib/ProfileData/InstrProf.cpp +++ b/llvm/lib/ProfileData/InstrProf.cpp @@ -599,6 +599,13 @@ void annotateValueSite(Module &M, Instruction &Inst, std::unique_ptr<InstrProfValueData[]> VD = InstrProfR.getValueForSite(ValueKind, SiteIdx, &Sum); + annotateValueSite(M, Inst, VD.get(), NV, Sum, ValueKind, MaxMDCount); +} + +void annotateValueSite(Module &M, Instruction &Inst, + const InstrProfValueData VD[], uint32_t NV, + uint64_t Sum, InstrProfValueKind ValueKind, + uint32_t MaxMDCount) { LLVMContext &Ctx = M.getContext(); MDBuilder MDHelper(Ctx); SmallVector<Metadata *, 3> Vals; diff --git a/llvm/unittests/ProfileData/InstrProfTest.cpp b/llvm/unittests/ProfileData/InstrProfTest.cpp index 0fe1b30cebd..31dca3c275d 100644 --- a/llvm/unittests/ProfileData/InstrProfTest.cpp +++ b/llvm/unittests/ProfileData/InstrProfTest.cpp @@ -299,6 +299,26 @@ TEST_P(MaybeSparseInstrProfTest, annotate_vp_data) { ASSERT_EQ(3U, ValueData[3].Count); ASSERT_EQ(2000U, ValueData[4].Value); ASSERT_EQ(2U, ValueData[4].Count); + + // Remove the MD_prof metadata + Inst->setMetadata(LLVMContext::MD_prof, 0); + // Annotate with 4 records. + InstrProfValueData VD0Sorted[] = {{1000, 6}, {2000, 5}, {3000, 4}, {4000, 3}, + {5000, 2}, {6000, 1}}; + annotateValueSite(*M, *Inst, &VD0Sorted[2], 4, 10, IPVK_IndirectCallTarget, 5); + Res = getValueProfDataFromInst(*Inst, IPVK_IndirectCallTarget, 5, + ValueData, N, T); + ASSERT_TRUE(Res); + ASSERT_EQ(4U, N); + ASSERT_EQ(10U, T); + ASSERT_EQ(3000U, ValueData[0].Value); + ASSERT_EQ(4U, ValueData[0].Count); + ASSERT_EQ(4000U, ValueData[1].Value); + ASSERT_EQ(3U, ValueData[1].Count); + ASSERT_EQ(5000U, ValueData[2].Value); + ASSERT_EQ(2U, ValueData[2].Count); + ASSERT_EQ(6000U, ValueData[3].Value); + ASSERT_EQ(1U, ValueData[3].Count); } TEST_P(MaybeSparseInstrProfTest, get_icall_data_read_write_with_weight) { |