[llvm] r255523 - [PGO] Value profiling text format reader/writer support

Xinliang David Li via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 15 11:46:13 PST 2015


thanks for the pointer -- looking ..

David

On Tue, Dec 15, 2015 at 11:27 AM, Evgenii Stepanov
<eugeni.stepanov at gmail.com> wrote:
> Hi David,
>
> I think your change caused this failure:
> http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-bootstrap/builds/10349/steps/check-llvm%20msan/logs/stdio
>
> On Mon, Dec 14, 2015 at 10:44 AM, Xinliang David Li via llvm-commits
> <llvm-commits at lists.llvm.org> wrote:
>> Author: davidxl
>> Date: Mon Dec 14 12:44:01 2015
>> New Revision: 255523
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=255523&view=rev
>> Log:
>> [PGO] Value profiling text format reader/writer support
>>
>> This patch adds the missing functionality in parsable
>> text format support for value profiling.
>>
>> Differential Revision: http://reviews.llvm.org/D15212
>>
>>
>> Added:
>>     llvm/trunk/test/tools/llvm-profdata/Inputs/vp-malform.proftext
>>     llvm/trunk/test/tools/llvm-profdata/Inputs/vp-malform2.proftext
>>     llvm/trunk/test/tools/llvm-profdata/Inputs/vp-truncate.proftext
>>     llvm/trunk/test/tools/llvm-profdata/value-prof.proftext
>> Modified:
>>     llvm/trunk/include/llvm/ProfileData/InstrProfReader.h
>>     llvm/trunk/lib/ProfileData/InstrProfReader.cpp
>>     llvm/trunk/lib/ProfileData/InstrProfWriter.cpp
>>     llvm/trunk/test/tools/llvm-profdata/text-format-errors.test
>>
>> Modified: llvm/trunk/include/llvm/ProfileData/InstrProfReader.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ProfileData/InstrProfReader.h?rev=255523&r1=255522&r2=255523&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/ProfileData/InstrProfReader.h (original)
>> +++ llvm/trunk/include/llvm/ProfileData/InstrProfReader.h Mon Dec 14 12:44:01 2015
>> @@ -106,8 +106,13 @@ private:
>>    /// Iterator over the profile data.
>>    line_iterator Line;
>>
>> +  // String table for holding a unique copy of all the strings in the profile.
>> +  InstrProfStringTable StringTable;
>> +
>>    TextInstrProfReader(const TextInstrProfReader &) = delete;
>>    TextInstrProfReader &operator=(const TextInstrProfReader &) = delete;
>> +  std::error_code readValueProfileData(InstrProfRecord &Record);
>> +
>>  public:
>>    TextInstrProfReader(std::unique_ptr<MemoryBuffer> DataBuffer_)
>>        : DataBuffer(std::move(DataBuffer_)), Line(*DataBuffer, true, '#') {}
>>
>> Modified: llvm/trunk/lib/ProfileData/InstrProfReader.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ProfileData/InstrProfReader.cpp?rev=255523&r1=255522&r2=255523&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/ProfileData/InstrProfReader.cpp (original)
>> +++ llvm/trunk/lib/ProfileData/InstrProfReader.cpp Mon Dec 14 12:44:01 2015
>> @@ -109,6 +109,68 @@ bool TextInstrProfReader::hasFormat(cons
>>                       [](char c) { return ::isprint(c) || ::isspace(c); });
>>  }
>>
>> +std::error_code
>> +TextInstrProfReader::readValueProfileData(InstrProfRecord &Record) {
>> +
>> +#define CHECK_LINE_END(Line)                                                   \
>> +  if (Line.is_at_end())                                                        \
>> +    return error(instrprof_error::truncated);
>> +#define READ_NUM(Str, Dst)                                                     \
>> +  if ((Str).getAsInteger(10, (Dst)))                                           \
>> +    return error(instrprof_error::malformed);
>> +#define VP_READ_ADVANCE(Val)                                                   \
>> +  CHECK_LINE_END(Line);                                                        \
>> +  uint32_t Val;                                                                \
>> +  READ_NUM((*Line), (Val));                                                    \
>> +  Line++;
>> +
>> +  if (Line.is_at_end())
>> +    return success();
>> +  uint32_t NumValueKinds;
>> +  if (Line->getAsInteger(10, NumValueKinds)) {
>> +    // No value profile data
>> +    return success();
>> +  }
>> +  if (NumValueKinds == 0 || NumValueKinds > IPVK_Last + 1)
>> +    return error(instrprof_error::malformed);
>> +  Line++;
>> +
>> +  for (uint32_t VK = 0; VK < NumValueKinds; VK++) {
>> +    VP_READ_ADVANCE(ValueKind);
>> +    if (ValueKind > IPVK_Last)
>> +      return error(instrprof_error::malformed);
>> +    VP_READ_ADVANCE(NumValueSites);
>> +    if (!NumValueSites)
>> +      continue;
>> +
>> +    Record.reserveSites(VK, NumValueSites);
>> +    for (uint32_t S = 0; S < NumValueSites; S++) {
>> +      VP_READ_ADVANCE(NumValueData);
>> +
>> +      std::vector<InstrProfValueData> CurrentValues;
>> +      for (uint32_t V = 0; V < NumValueData; V++) {
>> +        CHECK_LINE_END(Line);
>> +        std::pair<StringRef, StringRef> VD = Line->split(':');
>> +        uint64_t TakenCount, Value;
>> +        READ_NUM(VD.second, TakenCount);
>> +        if (VK == IPVK_IndirectCallTarget)
>> +          Value = (uint64_t)StringTable.insertString(VD.first);
>> +        else {
>> +          READ_NUM(VD.first, Value);
>> +        }
>> +        CurrentValues.push_back({Value, TakenCount});
>> +        Line++;
>> +      }
>> +      Record.addValueData(VK, S, CurrentValues.data(), NumValueData, nullptr);
>> +    }
>> +  }
>> +  return success();
>> +
>> +#undef CHECK_LINE_END
>> +#undef READ_NUM
>> +#undef VP_READ_ADVANCE
>> +}
>> +
>>  std::error_code TextInstrProfReader::readNextRecord(InstrProfRecord &Record) {
>>    // Skip empty lines and comments.
>>    while (!Line.is_at_end() && (Line->empty() || Line->startswith("#")))
>> @@ -147,6 +209,10 @@ std::error_code TextInstrProfReader::rea
>>      Record.Counts.push_back(Count);
>>    }
>>
>> +  // Check if value profile data exists and read it if so.
>> +  if (std::error_code EC = readValueProfileData(Record))
>> +    return EC;
>> +
>>    return success();
>>  }
>>
>>
>> Modified: llvm/trunk/lib/ProfileData/InstrProfWriter.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ProfileData/InstrProfWriter.cpp?rev=255523&r1=255522&r2=255523&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/ProfileData/InstrProfWriter.cpp (original)
>> +++ llvm/trunk/lib/ProfileData/InstrProfWriter.cpp Mon Dec 14 12:44:01 2015
>> @@ -172,15 +172,47 @@ void InstrProfWriter::write(raw_fd_ostre
>>    endian::Writer<little>(OS).write<uint64_t>(TableStart.second);
>>  }
>>
>> +static const char *ValueProfKindStr[] = {
>> +#define VALUE_PROF_KIND(Enumerator, Value) #Enumerator,
>> +#include "llvm/ProfileData/InstrProfData.inc"
>> +};
>> +
>>  void InstrProfWriter::writeRecordInText(const InstrProfRecord &Func,
>>                                          raw_fd_ostream &OS) {
>>    OS << Func.Name << "\n";
>>    OS << "# Func Hash:\n" << Func.Hash << "\n";
>> -  OS << "# Num Counters:\n" <<Func.Counts.size() << "\n";
>> +  OS << "# Num Counters:\n" << Func.Counts.size() << "\n";
>>    OS << "# Counter Values:\n";
>>    for (uint64_t Count : Func.Counts)
>>      OS << Count << "\n";
>>
>> +  uint32_t NumValueKinds = Func.getNumValueKinds();
>> +  if (!NumValueKinds) {
>> +    OS << "\n";
>> +    return;
>> +  }
>> +
>> +  OS << "# Num Value Kinds:\n" << Func.getNumValueKinds() << "\n";
>> +  for (uint32_t VK = 0; VK < IPVK_Last + 1; VK++) {
>> +    uint32_t NS = Func.getNumValueSites(VK);
>> +    if (!NS)
>> +      continue;
>> +    OS << "# ValueKind = " << ValueProfKindStr[VK] << ":\n" << VK << "\n";
>> +    OS << "# NumValueSites:\n" << NS << "\n";
>> +    for (uint32_t S = 0; S < NS; S++) {
>> +      uint32_t ND = Func.getNumValueDataForSite(VK, S);
>> +      OS << ND << "\n";
>> +      std::unique_ptr<InstrProfValueData[]> VD = Func.getValueForSite(VK, S);
>> +      for (uint32_t I = 0; I < ND; I++) {
>> +        if (VK == IPVK_IndirectCallTarget)
>> +          OS << reinterpret_cast<const char *>(VD[I].Value) << ":"
>> +             << VD[I].Count << "\n";
>> +        else
>> +          OS << VD[I].Value << ":" << VD[I].Count << "\n";
>> +      }
>> +    }
>> +  }
>> +
>>    OS << "\n";
>>  }
>>
>>
>> Added: llvm/trunk/test/tools/llvm-profdata/Inputs/vp-malform.proftext
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-profdata/Inputs/vp-malform.proftext?rev=255523&view=auto
>> ==============================================================================
>> --- llvm/trunk/test/tools/llvm-profdata/Inputs/vp-malform.proftext (added)
>> +++ llvm/trunk/test/tools/llvm-profdata/Inputs/vp-malform.proftext Mon Dec 14 12:44:01 2015
>> @@ -0,0 +1,42 @@
>> +foo
>> +# Func Hash:
>> +10
>> +# Num Counters:
>> +2
>> +# Counter Values:
>> +999000
>> +359800
>> +
>> +foo2
>> +# Func Hash:
>> +10
>> +# Num Counters:
>> +2
>> +# Counter Values:
>> +1001000
>> +360200
>> +
>> +main
>> +# Func Hash:
>> +16650
>> +# Num Counters:
>> +4
>> +# Counter Values:
>> +2
>> +2000
>> +2000000
>> +999000
>> +# NumValueKinds
>> +1
>> +# Value Kind IPVK_IndirectCallTarget
>> +0
>> +# NumSites
>> +3
>> +# Values for each site
>> +0
>> +2
>> +# !!!! Malformed Value/Count pair
>> +foo+100
>> +foo2:1000
>> +1
>> +foo2:20000
>>
>> Added: llvm/trunk/test/tools/llvm-profdata/Inputs/vp-malform2.proftext
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-profdata/Inputs/vp-malform2.proftext?rev=255523&view=auto
>> ==============================================================================
>> --- llvm/trunk/test/tools/llvm-profdata/Inputs/vp-malform2.proftext (added)
>> +++ llvm/trunk/test/tools/llvm-profdata/Inputs/vp-malform2.proftext Mon Dec 14 12:44:01 2015
>> @@ -0,0 +1,32 @@
>> +foo
>> +# Func Hash:
>> +10
>> +# Num Counters:
>> +2
>> +# Counter Values:
>> +999000
>> +359800
>> +
>> +main
>> +# Func Hash:
>> +16650
>> +# Num Counters:
>> +4
>> +# Counter Values:
>> +2
>> +2000
>> +2000000
>> +999000
>> +# NumValueKinds
>> +1
>> +# Value Kind IPVK_IndirectCallTarget
>> +0
>> +# NumSites
>> +3
>> +# Values for each site
>> +0
>> +# !! Malformed value site, missing one value
>> +2
>> +foo:100
>> +1
>> +foo2:20000
>>
>> Added: llvm/trunk/test/tools/llvm-profdata/Inputs/vp-truncate.proftext
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-profdata/Inputs/vp-truncate.proftext?rev=255523&view=auto
>> ==============================================================================
>> --- llvm/trunk/test/tools/llvm-profdata/Inputs/vp-truncate.proftext (added)
>> +++ llvm/trunk/test/tools/llvm-profdata/Inputs/vp-truncate.proftext Mon Dec 14 12:44:01 2015
>> @@ -0,0 +1,36 @@
>> +foo
>> +# Func Hash:
>> +10
>> +# Num Counters:
>> +2
>> +# Counter Values:
>> +999000
>> +359800
>> +
>> +foo2
>> +# Func Hash:
>> +10
>> +# Num Counters:
>> +2
>> +# Counter Values:
>> +1001000
>> +360200
>> +
>> +main
>> +# Func Hash:
>> +16650
>> +# Num Counters:
>> +4
>> +# Counter Values:
>> +2
>> +2000
>> +2000000
>> +999000
>> +# NumValueKinds
>> +1
>> +# Value Kind IPVK_IndirectCallTarget
>> +0
>> +# NumSites
>> +3
>> +# Values for each site
>> +0
>>
>> Modified: llvm/trunk/test/tools/llvm-profdata/text-format-errors.test
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-profdata/text-format-errors.test?rev=255523&r1=255522&r2=255523&view=diff
>> ==============================================================================
>> --- llvm/trunk/test/tools/llvm-profdata/text-format-errors.test (original)
>> +++ llvm/trunk/test/tools/llvm-profdata/text-format-errors.test Mon Dec 14 12:44:01 2015
>> @@ -18,3 +18,12 @@ NO-COUNTS: error: {{.*}}no-counts.profte
>>  RUN: not llvm-profdata show %p/Inputs/text-format-errors.text.bin 2>&1 | FileCheck %s --check-prefix=BINARY
>>  BINARY: error: {{.+}}: Unrecognized instrumentation profile encoding format
>>  BINARY: Perhaps you forgot to use the -sample option?
>> +
>> +5- Detect malformed value profile data
>> +RUN: not llvm-profdata show %p/Inputs/vp-malform.proftext 2>&1 | FileCheck %s --check-prefix=VP
>> +RUN: not llvm-profdata show %p/Inputs/vp-malform2.proftext 2>&1 | FileCheck %s --check-prefix=VP
>> +VP: Malformed instrumentation profile data
>> +
>> +6- Detect truncated value profile data
>> +RUN: not llvm-profdata show %p/Inputs/vp-truncate.proftext 2>&1 | FileCheck %s --check-prefix=VPTRUNC
>> +VPTRUNC: Truncated profile data
>>
>> Added: llvm/trunk/test/tools/llvm-profdata/value-prof.proftext
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-profdata/value-prof.proftext?rev=255523&view=auto
>> ==============================================================================
>> --- llvm/trunk/test/tools/llvm-profdata/value-prof.proftext (added)
>> +++ llvm/trunk/test/tools/llvm-profdata/value-prof.proftext Mon Dec 14 12:44:01 2015
>> @@ -0,0 +1,61 @@
>> +# RUN: llvm-profdata show -ic-targets  -all-functions %s | FileCheck %s --check-prefix=IC
>> +# RUN: llvm-profdata show -ic-targets -counts -text -all-functions %s | FileCheck %s --check-prefix=ICTEXT
>> +# RUN: llvm-profdata merge -o %t.profdata  %s
>> +# RUN: llvm-profdata show -ic-targets  -all-functions %t.profdata | FileCheck %s --check-prefix=IC
>> +
>> +foo
>> +# Func Hash:
>> +10
>> +# Num Counters:
>> +2
>> +# Counter Values:
>> +999000
>> +359800
>> +
>> +foo2
>> +# Func Hash:
>> +10
>> +# Num Counters:
>> +2
>> +# Counter Values:
>> +1001000
>> +360200
>> +
>> +main
>> +# Func Hash:
>> +16650
>> +# Num Counters:
>> +4
>> +# Counter Values:
>> +2
>> +2000
>> +2000000
>> +999000
>> +# NumValueKinds
>> +1
>> +# Value Kind IPVK_IndirectCallTarget
>> +0
>> +# NumSites
>> +3
>> +# Values for each site
>> +0
>> +2
>> +foo:100
>> +foo2:1000
>> +1
>> +foo2:20000
>> +
>> +#IC: Indirect Call Site Count: 3
>> +#IC-NEXT:    Indirect Target Results:
>> +#IC-NEXT:      [ 1, foo, 100 ]
>> +#IC-NEXT:      [ 1, foo2, 1000 ]
>> +#IC-NEXT:      [ 2, foo2, 20000 ]
>> +
>> +#ICTEXT: foo:100
>> +#ICTEXT-NEXT: foo2:1000
>> +#ICTEXT-NEXT: 1
>> +#ICTEXT-NEXT: foo2:20000
>> +# RUN: llvm-profdata show -ic-targets  -all-functions %s | FileCheck %s --check-prefix=IC
>> +# RUN: llvm-profdata show -ic-targets -counts -text -all-functions %s | FileCheck %s --check-prefix=ICTEXT
>> +# RUN: llvm-profdata merge -o %t.profdata  %s
>> +# RUN: llvm-profdata show -ic-targets  -all-functions %t.profdata | FileCheck %s --check-prefix=IC
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list