[llvm] r254219 - [PGO] Allow value profile writer interface to allocated target buffer

Vedant Kumar via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 1 11:34:58 PST 2015


> On Nov 27, 2015, at 9:37 PM, Xinliang David Li via llvm-commits <llvm-commits at lists.llvm.org> wrote:
> 
> Author: davidxl
> Date: Fri Nov 27 23:37:01 2015
> New Revision: 254219
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=254219&view=rev
> Log:
> [PGO] Allow value profile writer interface to allocated target buffer 
> 
> Raw profile writer needs to write all data of one kind in one continuous block,
> so the buffer needs to be pre-allocated and passed to the writer method in
> pieces for function profile data. The change adds the support for raw value data
> writing.
> 
> Modified:
>    llvm/trunk/include/llvm/ProfileData/InstrProf.h
>    llvm/trunk/lib/ProfileData/InstrProf.cpp
>    llvm/trunk/unittests/ProfileData/InstrProfTest.cpp
> 
> Modified: llvm/trunk/include/llvm/ProfileData/InstrProf.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ProfileData/InstrProf.h?rev=254219&r1=254218&r2=254219&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/ProfileData/InstrProf.h (original)
> +++ llvm/trunk/include/llvm/ProfileData/InstrProf.h Fri Nov 27 23:37:01 2015
> @@ -513,7 +513,8 @@ typedef struct ValueProfData {
>   /// All data in the instance are properly byte swapped. The input
>   /// data is assumed to be in little endian order.
>   static ErrorOr<std::unique_ptr<ValueProfData>>
> -  getValueProfData(const unsigned char *D, const unsigned char *const BufferEnd,
> +  getValueProfData(const unsigned char *SrcBuffer,
> +                   const unsigned char *const SrcBufferEnd,
>                    support::endianness SrcDataEndianness);
>   /// Swap byte order from \c Endianness order to host byte order.
>   void swapBytesToHost(support::endianness Endianness);
> @@ -596,8 +597,8 @@ uint32_t getValueProfDataSizeRT(const Va
> 
> /* Return a ValueProfData instance that stores the data collected at runtime. */
> ValueProfData *
> -serializeValueProfDataFromRT(const ValueProfRuntimeRecord *Record);
> -
> +serializeValueProfDataFromRT(const ValueProfRuntimeRecord *Record,
> +                             ValueProfData *Dst);
> 
> /*! \brief Return the \c ValueProfRecord header size including the
>  * padding bytes.
> 
> Modified: llvm/trunk/lib/ProfileData/InstrProf.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ProfileData/InstrProf.cpp?rev=254219&r1=254218&r2=254219&view=diff
> ==============================================================================
> --- llvm/trunk/lib/ProfileData/InstrProf.cpp (original)
> +++ llvm/trunk/lib/ProfileData/InstrProf.cpp Fri Nov 27 23:37:01 2015
> @@ -170,10 +170,12 @@ void serializeValueProfRecordFrom(ValueP
>   }
> }
> 
> -ValueProfData *serializeValueProfDataFrom(ValueProfRecordClosure *Closure) {
> +ValueProfData *serializeValueProfDataFrom(ValueProfRecordClosure *Closure,
> +                                          ValueProfData *DstData) {
>   uint32_t TotalSize = getValueProfDataSize(Closure);
> 
> -  ValueProfData *VPD = Closure->AllocValueProfData(TotalSize);
> +  ValueProfData *VPD =
> +      DstData ? DstData : Closure->AllocValueProfData(TotalSize);
> 
>   VPD->TotalSize = TotalSize;
>   VPD->NumValueKinds = Closure->GetNumValueKinds(Closure->Record);
> @@ -259,7 +261,7 @@ ValueProfData::serializeFrom(const Instr
>   InstrProfRecordClosure.Record = &Record;
> 
>   std::unique_ptr<ValueProfData> VPD(
> -      serializeValueProfDataFrom(&InstrProfRecordClosure));
> +      serializeValueProfDataFrom(&InstrProfRecordClosure, 0));

Could you use `nullptr` here?


>   return VPD;
> }
> 
> @@ -367,16 +369,18 @@ uint32_t getValueProfDataSizeRT(const Va
> }
> 
> /* Return a ValueProfData instance that stores the data collected
> -   from runtime. */
> + * from runtime. If \c DstData is provided by the caller, the value
> + * profile data will be store in *DstData and DstData is returned,
> + * otherwise the method will allocate space for the value data and
> + * return pointer to the newly allocated space.
> + */
> ValueProfData *
> -serializeValueProfDataFromRT(const ValueProfRuntimeRecord *Record) {
> +serializeValueProfDataFromRT(const ValueProfRuntimeRecord *Record,
> +                             ValueProfData *DstData) {
>   RTRecordClosure.Record = Record;
> -  return serializeValueProfDataFrom(&RTRecordClosure);
> +  return serializeValueProfDataFrom(&RTRecordClosure, DstData);
> }
> 
> -
> -
> -
> void ValueProfRecord::deserializeTo(InstrProfRecord &Record,
>                                     InstrProfRecord::ValueMapType *VMap) {
>   Record.reserveSites(Kind, NumValueSites);
> 
> Modified: llvm/trunk/unittests/ProfileData/InstrProfTest.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ProfileData/InstrProfTest.cpp?rev=254219&r1=254218&r2=254219&view=diff
> ==============================================================================
> --- llvm/trunk/unittests/ProfileData/InstrProfTest.cpp (original)
> +++ llvm/trunk/unittests/ProfileData/InstrProfTest.cpp Fri Nov 27 23:37:01 2015
> @@ -409,7 +409,7 @@ TEST_F(InstrProfTest, runtime_value_prof
>   initializeValueProfRuntimeRecord(&RTRecord, &NumValueSites[0],
>                                    &ValueProfNodes[0]);
> 
> -  ValueProfData *VPData = serializeValueProfDataFromRT(&RTRecord);
> +  ValueProfData *VPData = serializeValueProfDataFromRT(&RTRecord, 0);

Ditto.


> 
>   InstrProfRecord Record("caller", 0x1234, {1ULL << 31, 2});
> 
> 
> 
> _______________________________________________
> 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