[llvm] r265890 - [PGO] Fix deserialize bug
Adam Nemet via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 11 10:20:01 PDT 2016
Thanks!
> On Apr 11, 2016, at 10:18 AM, Xinliang David Li <davidxl at google.com> wrote:
>
> Done.
>
> David
>
> On Mon, Apr 11, 2016 at 10:12 AM, Adam Nemet <anemet at apple.com <mailto:anemet at apple.com>> wrote:
>
> > On Apr 9, 2016, at 8:32 PM, Xinliang David Li via llvm-commits <llvm-commits at lists.llvm.org <mailto:llvm-commits at lists.llvm.org>> wrote:
> >
> > Author: davidxl
> > Date: Sat Apr 9 22:32:02 2016
> > New Revision: 265890
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=265890&view=rev <http://llvm.org/viewvc/llvm-project?rev=265890&view=rev>
> > Log:
> > [PGO] Fix deserialize bug
> >
> > Raw function pointer collected by value
> > profile data may be from external functions
> > that are not instrumented. They won't have
> > mapping data to be used by the deserializer.
> > Force the value to be 0 in this case.
>
> Please also add this comment to the code as well.
>
> Adam
>
> >
> > Modified:
> > llvm/trunk/lib/ProfileData/InstrProf.cpp
> > llvm/trunk/unittests/ProfileData/InstrProfTest.cpp
> >
> > Modified: llvm/trunk/lib/ProfileData/InstrProf.cpp
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ProfileData/InstrProf.cpp?rev=265890&r1=265889&r2=265890&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ProfileData/InstrProf.cpp?rev=265890&r1=265889&r2=265890&view=diff>
> > ==============================================================================
> > --- llvm/trunk/lib/ProfileData/InstrProf.cpp (original)
> > +++ llvm/trunk/lib/ProfileData/InstrProf.cpp Sat Apr 9 22:32:02 2016
> > @@ -398,8 +398,10 @@ uint64_t InstrProfRecord::remapValue(uin
> > std::lower_bound(ValueMap->begin(), ValueMap->end(), Value,
> > [](const std::pair<uint64_t, uint64_t> &LHS,
> > uint64_t RHS) { return LHS.first < RHS; });
> > - if (Result != ValueMap->end())
> > + if (Result != ValueMap->end() && Result->first == Value)
> > Value = (uint64_t)Result->second;
> > + else
> > + Value = 0;
> > break;
> > }
> > }
> >
> > Modified: llvm/trunk/unittests/ProfileData/InstrProfTest.cpp
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ProfileData/InstrProfTest.cpp?rev=265890&r1=265889&r2=265890&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ProfileData/InstrProfTest.cpp?rev=265890&r1=265889&r2=265890&view=diff>
> > ==============================================================================
> > --- llvm/trunk/unittests/ProfileData/InstrProfTest.cpp (original)
> > +++ llvm/trunk/unittests/ProfileData/InstrProfTest.cpp Sat Apr 9 22:32:02 2016
> > @@ -752,6 +752,46 @@ TEST_P(MaybeSparseInstrProfTest, runtime
> > free(VPData);
> > }
> >
> > +static uint16_t NumValueSites2[IPVK_Last + 1] = {1};
> > +TEST_P(MaybeSparseInstrProfTest, runtime_value_prof_data_read_write_mapping) {
> > + ValueProfRuntimeRecord RTRecord;
> > + initializeValueProfRuntimeRecord(&RTRecord, &NumValueSites2[0],
> > + &ValueProfNodes[0]);
> > +
> > + ValueProfData *VPData = serializeValueProfDataFromRT(&RTRecord, nullptr);
> > +
> > + InstrProfRecord Record("caller", 0x1234, {1ULL << 31, 2});
> > + InstrProfSymtab Symtab;
> > + Symtab.mapAddress(uint64_t(callee1), 0x1000ULL);
> > + Symtab.mapAddress(uint64_t(callee2), 0x2000ULL);
> > + Symtab.mapAddress(uint64_t(callee3), 0x3000ULL);
> > + Symtab.mapAddress(uint64_t(callee4), 0x4000ULL);
> > + // Missing mapping for callee5
> > + Symtab.finalizeSymtab();
> > +
> > + VPData->deserializeTo(Record, &Symtab.getAddrHashMap());
> > +
> > + // Now read data from Record and sanity check the data
> > + ASSERT_EQ(1U, Record.getNumValueSites(IPVK_IndirectCallTarget));
> > + ASSERT_EQ(5U, Record.getNumValueDataForSite(IPVK_IndirectCallTarget, 0));
> > +
> > + auto Cmp = [](const InstrProfValueData &VD1, const InstrProfValueData &VD2) {
> > + return VD1.Count > VD2.Count;
> > + };
> > + std::unique_ptr<InstrProfValueData[]> VD_0(
> > + Record.getValueForSite(IPVK_IndirectCallTarget, 0));
> > + std::sort(&VD_0[0], &VD_0[5], Cmp);
> > + ASSERT_EQ(VD_0[0].Value, 0x2000ULL);
> > + ASSERT_EQ(1000U, VD_0[0].Count);
> > + ASSERT_EQ(VD_0[1].Value, 0x3000ULL);
> > + ASSERT_EQ(500U, VD_0[1].Count);
> > + ASSERT_EQ(VD_0[2].Value, 0x1000ULL);
> > + ASSERT_EQ(400U, VD_0[2].Count);
> > +
> > + // callee5 does not have a mapped value -- default to 0.
> > + ASSERT_EQ(VD_0[4].Value, 0ULL);
> > +}
> > +
> > TEST_P(MaybeSparseInstrProfTest, get_max_function_count) {
> > InstrProfRecord Record1("foo", 0x1234, {1ULL << 31, 2});
> > InstrProfRecord Record2("bar", 0, {1ULL << 63});
> >
> >
> > _______________________________________________
> > 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>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160411/1ea56c9a/attachment.html>
More information about the llvm-commits
mailing list