[PATCH] D34838: Prototype: Reduce llvm-profdata merge memory usage further

Xinliang David Li via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 5 13:54:57 PDT 2017


On Wed, Jul 5, 2017 at 1:27 PM, David Blaikie <dblaikie at gmail.com> wrote:

>
>
> On Thu, Jun 29, 2017 at 7:48 PM David Li via Phabricator <
> reviews at reviews.llvm.org> wrote:
>
>> davidxl added a comment.
>>
>> In summary, I think this patch should be minimized by
>>
>
> While I appreciate/value minimizing churn - I'm mostly motivated by/trying
> to ensure the best form for the code, rather than the smallest change here.
>


It is not just about minimizing the churns.  Currently the class
InstrProfRecord abstracts everything the client needs to know about the
per-function profile which is nice thing we'd like to maintain.


>
> If they happen to coincide, that's great.
>
>
>> 1. sinking the minimal number of interfaces into Counter subclass
>> 2. for any sunk interface, provide a wrapper in the parent class
>> InstrProfRecord
>> 3. avoid exposing internal members to client side other than
>> InstrProfWriters (may be making those method private and making Writer a
>> friend ?)
>>
>
> I did consider this (& certainly open to discussing the tradeoff further
> to see if it's the right one) - my thinking was more that this change
> indicates a new use case/way to pivot the InstrProfRecord data structure
> that's not exclusively in the domain of the InstrProfWriter.
>
> Looking at it that way, it seems to me that it's a good thing to move more
> parts of the code over to only caring about the part of the data structure
> that's relevant to them - which in many cases is just the counters (though
> I'd love a better name that "CounterHolder" (& could make it a non-nested
> class, especially if it had a good standalone name) - even potentially
> using the InstrProfRecord as the name for this name/hash-less part of the
> data and "NamedInstrProfRecord" for the Name+Hash+InstrProfRecord - though
> I haven't prototyped that/given it a lot of thought)
>

I like the suggestion to promote the CounterHolder class into the first
class citizen -- InstrProfRecord with the existing InstrProfRecord be
renamed to NamedInstrProfRecord or InstrProfRecordWithKey.   I expect
majority of the APIs do not care about the name key anyway. The only
affected interfaces are related to profile reader iterators and a few
writer changes.

I think the above will be clean.

thanks,

David


>
>
>> 4. split out unrelated changes
>>
>>
>>
>> ================
>> Comment at: include/llvm/ProfileData/InstrProf.h:253
>> +                       ArrayRef<InstrProfValueData> VDs, uint64_t Sum,
>> +                       InstrProfValueKind ValueKind, uint32_t
>> MaxMDCount);
>>
>> ----------------
>> unrelated format change?
>>
>>
>> ================
>> Comment at: include/llvm/ProfileData/InstrProf.h:701
>> +    /// counts of all target values at this site.
>> +    inline uint64_t getValueForSite(InstrProfValueData Dest[],
>> +                                    uint32_t ValueKind, uint32_t Site)
>> const;
>> ----------------
>> format change?
>>
>>
>> ================
>> Comment at: include/llvm/ProfileData/InstrProfData.inc:317
>>     */
>> -  void deserializeTo(InstrProfRecord &Record,
>> -                     InstrProfRecord::ValueMapType *VMap);
>> +  void deserializeTo(InstrProfRecord::CounterHolder &Record,
>> +                     InstrProfRecord::CounterHolder::ValueMapType
>> *VMap);
>> ----------------
>> Why this change? IMO, we should reduce exposing CounterHolder if
>> possible  and maintain/use APIs at the InstrProfRecord level.
>>
>>
>> ================
>> Comment at: include/llvm/ProfileData/InstrProfData.inc:361
>>     */
>> -  static uint32_t getSize(const InstrProfRecord &Record);
>> +  static uint32_t getSize(const InstrProfRecord::CounterHolder
>> &Counters);
>>    /*!
>> ----------------
>> Same here.
>>
>>
>> ================
>> Comment at: include/llvm/ProfileData/InstrProfData.inc:530
>>  INSTR_PROF_VISIBILITY uint32_t
>> -getValueProfDataSize(ValueProfRecordClosure *Closure) {
>> +getValueProfDataSize(const void *Record, const ValueProfRecordVTable
>> *VTable) {
>>    uint32_t Kind;
>> ----------------
>> Can this be split into different patch?
>>
>>
>> ================
>> Comment at: include/llvm/ProfileData/InstrProfWriter.h:66
>>    /// Write \c Record in text format to \c OS
>> -  static void writeRecordInText(const InstrProfRecord &Record,
>> +  static void writeRecordInText(StringRef Name, uint64_t Hash,
>> +                                const InstrProfRecord::CounterHolder
>> &Counters,
>> ----------------
>> There is no need to change this interface. You are passing name, hash
>> etc, so might as well create a InstrProfRecord.
>>
>
> But then the counters must be copied or moved into the InstrProfRecord,
> making it destructive (or expensive if it's a copy instead of a move) to
> the writing step (not the end of the world for InstrProfWriter - but seems
> unnecessarily shuffling things around when this is an implementation detail
> of the writer anyway).
>
>
>>
>>
>> ================
>> Comment at: lib/ProfileData/InstrProf.cpp:641
>> +static const ValueProfRecordVTable InstrProfRecordCountersVTable = {
>> +    getNumValueKindsInstrProfCounters,
>> +    getNumValueSitesInstrProfCounters,
>> ----------------
>> These naming changes are not necessary
>>
>
> Seemed relevant if the name of the data structure being operated on
> changes (but I agree, if the design ends up being not to reduce the surface
> area of code that only needs to handle the counters, then these names
> wouldn't need to change).
>
>
>>
>>
>> ================
>> Comment at: lib/ProfileData/InstrProf.cpp:651
>> +uint32_t
>> +ValueProfData::getSize(const InstrProfRecord::CounterHolder &Counters) {
>> +  return getValueProfDataSize(&Counters, &InstrProfRecordCountersVTable
>> );
>> ----------------
>> The interface change here is not necessary.
>>
>>
>> ================
>> Comment at: lib/ProfileData/InstrProfWriter.cpp:152
>> +              .second; // FIXME: Avoid copying by fixing the addRecord
>> API
>> +      SummaryBuilder->addRecord(std::move(R));
>>
>> ----------------
>> davidxl wrote:
>> > Summary Builder does not need name, hash etc. so perfhaps fixing API is
>> the right way.
>> On second thought, to reduce exposing implementation details and
>> minimizing interface changes, it is cleaner to just do
>>
>> SummaryBuilder->addRecord(InstrProfRecord(K, ProfileData.first,
>> Counters));
>>
>
> But the SummaryBuilder doesn't need/use the name or hash - so it seems
> strange to me to pass that. (again, to the design tradeoff/discussion above)
>
>
>>
>> Similarly for the SerializeFrom call below and ValueProfData::getSize()
>> call above.
>>
>>
>> https://reviews.llvm.org/D34838
>>
>>
>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170705/bc0bf8c5/attachment-0001.html>


More information about the llvm-commits mailing list