[llvm-dev] Queries Regarding Usage of PGOInstrumentation Passes instead of Deprecated ProfileInfo

Malhar Thakkar via llvm-dev llvm-dev at lists.llvm.org
Tue Aug 21 14:20:04 PDT 2018


I forgot to mention that I'm using LLVM 5.0.

Is the problem something that was fixed post LLVM 5.0?



Thank you.

Regards,
Malhar

On Wed, Aug 15, 2018 at 5:14 PM, Xinliang David Li <xinliangli at gmail.com>
wrote:

>
>
> On Wed, Aug 15, 2018 at 1:28 PM Xinliang David Li <xinliangli at gmail.com>
> wrote:
>
>>
>>
>> On Wed, Aug 15, 2018 at 12:46 PM Malhar Thakkar <cs13b1031 at iith.ac.in>
>> wrote:
>>
>>> Thank you so much for your response.
>>>
>>> On Wed, Aug 15, 2018 at 3:08 PM, Xinliang David Li <xinliangli at gmail.com
>>> > wrote:
>>>
>>>>
>>>>
>>>> On Wed, Aug 15, 2018 at 7:36 AM Malhar Thakkar via llvm-dev <
>>>> llvm-dev at lists.llvm.org> wrote:
>>>>
>>>>> Hey all,
>>>>>
>>>>> I have a piece of code (written in LLVM 2.8) which uses profiling
>>>>> results produced by ProfileInfo. It essentially computes the number of
>>>>> iterations performed by a loop from the profiling information available.
>>>>> The code snippet in my pass looks something like this.
>>>>>
>>>>>   BasicBlock *header = loop->getHeader();
>>>>>   ProfileInfo &pi = getAnalysis< ProfileInfo >();
>>>>>   for(pred_iterator i=pred_begin(header), e=pred_end(header); i!=e; ++i)
>>>>>   {
>>>>>     BasicBlock *pred = *i;
>>>>>
>>>>>     const double edgeCount = *pi.getEdgeWeight*( ProfileInfo::Edge(pred,header) );
>>>>>     */* Some code */*
>>>>>   }
>>>>>
>>>>> Now, since ProfileInfo has been deprecated and we have
>>>>> PGOInstrumentation passes along with BranchProbability and BlockFrequency,
>>>>> I wish to update the above snippet, in particular, obtaining the edge
>>>>> weights (highlighted in the code above) using the new tools.
>>>>>
>>>>> In order to do that, I'm first generating edge count profile by the
>>>>> PGOInstrumentationGen pass and then interpreting the edge count profile
>>>>> with PGOInstrumentationUse.
>>>>>
>>>>> In the original code, where I had
>>>>> au.addRequired< ProfileInfo >(), I now have
>>>>>
>>>>>
>>>>> *au.addRequired< BlockFrequencyInfoWrapperPass >();au.addRequired<
>>>>> BranchProbabilityInfoWrapperPass >();*
>>>>> Now, I have the following queries.
>>>>>
>>>>>    - How do I use the edge count and branch weights data obtained
>>>>>    using PGOInstrumentationUse in my pass and replace the
>>>>>    *getEdgeWeight()* from ProfileInfo?
>>>>>
>>>>>
>>>> You can do
>>>>  BPI.getEdgeProbability(Src, Dest).scale(BFI.
>>>> getBlockProfileCount(Src));
>>>>
>>>
>>> I tried doing this but there are some semantic issues that I'm facing.
>>> There is a loop in my program which I know is a hot loop since it is the
>>> only loop inside the function main() and essentially, all the computations
>>> are performed within this function via function calls. However, when I
>>> perform getBlockProfileCount(Src) where Src is the preheader of the
>>> said loop, I find that it returns zero and upon further investigation, I
>>> found that the entry frequency for the function was 6148904414811 and the
>>> block frequency for the aforementioned preheader block was 6148904394768
>>> and after performing udiv, since it is an integer division,
>>> getBlockProfileCount(Src) returned zero and hence, my code infers that it
>>> is not a hot loop when in fact it clearly is.
>>>
>>
> Easwaran, I think this is a bug that needs to be fixed.
>
> David
>
>
>
>>
>>> Any suggestions on why this may be happening?
>>>
>>
>> What is function entry's profile count? Note it is different from entry
>> frequency (which is synthetic). You can find the function entry's count
>> from entry's prof meta data. There is also an API to get it.
>>
>>
>>>
>>>>
>>>>>
>>>>>    - If I call *getBlockProfileCount() *from the BlockFrequency pass,
>>>>>    will that give me the data read during PGOInstrumentationUse or data based
>>>>>    on static analysis? In other words, does the data obtained during
>>>>>    PGOInstrumentationUse "propagate" to BlockFrequency and BranchProbability?
>>>>>
>>>>>
>>>>> Correct.
>>>>
>>> Just to confirm, when you say "correct", do you mean to say that the
>>> information in fact does get propagated to BlockFrequency and
>>> BranchProbability? If yes, how does the propagation take place?
>>>
>>
>> Branch probability info analysis pass will use the profile meta data
>> (read in from profile data and annotated in the IR) and use that to compute
>> branch probability. The block frequency propagation pass uses BPI info to
>> compute relative block frequencies.   The actual profile count of the
>> function entry is kept, and a block's actual profile count can then be
>> recomputed using Entry Frequency, block frequency, and the entry count data.
>>
>> David
>>
>>
>>
>>>
>>>
>>> Thank you.
>>>
>>> Regards,
>>> Malhar
>>>
>>>>
>>>> David
>>>>
>>>>
>>>>
>>>>> Thank you.
>>>>>
>>>>>
>>>>> Regards,
>>>>> Malhar
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>>>>>> _______________________________________________
>>>>> LLVM Developers mailing list
>>>>> llvm-dev at lists.llvm.org
>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>>>>
>>>>
>>>>>>
>>
ᐧ
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180821/7872d9f3/attachment.html>


More information about the llvm-dev mailing list