[LLVMdev] How to keep FunctionPass analysis result alive in Module Pass?

John Criswell criswell at illinois.edu
Tue Mar 13 09:41:52 PDT 2012


On 3/13/12 11:39 AM, Tobias von Koch wrote:
> Hi John & Fan,
>
> I hit the exact same problem today. I can confirm that Fan's 
> observation of getting the /*same*/ LoopInfo* from subsequent calls to 
> getAnalysis<LoopInfo>(function) for /*distinct*/ functions is indeed true.
>
> I was very surprised by this at first as well, but I think I've found 
> an explanation - please anyone correct me if this is wrong:
>
> What you're getting from getAnalysis<>(function) is a reference to the 
> function pass after it has been run on the specified function. While 
> you can run a function pass on many different functions, there still 
> exists only *one* instance of the pass itself. The only thing that 
> changes between different calls to getAnalysis<LoopInfo>(F) is the 
> analysis information held by the LoopInfo pass in its LoopInfoBase 
> member. It gets released and overwritten on every call to 
> LoopInfo::runOnFunction() - see the call to releaseMemory() right at 
> the beginning.

That seems like a reasonable explanation.

>
> The idea of creating some sort of Map of Function* ----> LoopInfo* 
> therefore won't work. It also doesn't make sense to keep Loop* 
> pointers around after getAnalysis<LoopInfo>() has been called again 
> because all that memory gets released (which is how I hit this problem)...
>
> Now, Fan, the practical consequence of this is that if you want to use 
> LoopInfo in a ModulePass, you either have to do all your work that 
> uses LoopInfo in between getAnalysis<LoopInfo> calls (if that's 
> possible you're probably better off writing a FunctionPass in the 
> first place) /OR/ keep re-running getAnalysis<LoopInfo> which is very 
> inefficient. I'd imagine the same goes for DominatorTree.
>
> In general, it would be nice if there was some logical separation 
> between a /Function Pass /and the /Analysis Information /it produces. 
> For LoopInfo, it's kind of there since all the data is in this 
> LoopInfoBase object but there is no way of taking ownership of that...

Can't you just copy the analysis results out of LoopInfo as Fan 
suggested?  I would think that if you can query it, you can copy it.

-- John T.

>
> -- Tobias
>
>
> On Fri, Mar 9, 2012 at 22:34, John Criswell <criswell at illinois.edu 
> <mailto:criswell at illinois.edu>> wrote:
>
>     On 3/9/12 4:28 PM, Fan Long wrote:
>>     Thank you for your quick reply.
>>
>>     Actually I am using a std::map to map Function* to LoopInfo*, but
>>     that does not help in this case. Each time I call
>>     getAnalysis<llvm::LoopInfo>(*F), it returns the same instance of
>>     llvm::LoopInfo, so the std::map is just mapping every function
>>     into the same instance. It seems only the analysis result for the
>>     last function is valid, because all the result for all previous
>>     functions are erased.
>
>     Just to make sure I understand: you are saying that every time you
>     call getAnalysis<LoopInfo>(), you get the *same* LoopInfo *
>     regardless of whether you call it on the same function or on a
>     different function.  Is that correct?
>
>     Getting the same LoopInfo * when you call getAnalysis<> on the
>     same function twice would not surprise me.  Getting the same
>     LoopInfo * when you call getAnalysis on F1 and F2 where F1 and F2
>     are different functions would surprise me greatly.
>
>
>>
>>     The only workaround solution I have now is to copy all analysis
>>     result out of the data structure of LoopInfo before I call next
>>     &getAnalysis(). Because llvm::LoopInfo does not provide copy
>>     method, this will be very dirty to do so.
>
>     Yes, that may be what you have to do.
>
>
>     -- John T.
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20120313/cc87a0c7/attachment.html>


More information about the llvm-dev mailing list