[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