[llvm-dev] pass invalidation

John Criswell via llvm-dev llvm-dev at lists.llvm.org
Wed Jun 22 08:22:30 PDT 2016


On 6/22/16 1:15 AM, Yuxi Chen wrote:
> 1. If I don't use getAnalysisUsage, are there other ways to implement 
> invocation of different passes.

As Mehdi stated, you must explicitly run the other passes by scheduling 
them in the pass manager.  If you're using opt to run your pass, you 
just tell opt to run the transform passes before your passes.  If you're 
writing a tool, you have code that creates a PassManager object and adds 
passes to the PassManager object.  In that case, you just add the 
tranform passes to the PassManager object in the correct order.

> 2. Transform pass can't rely on other transform passes, if we really 
> want to do that, what can we do?

To clarify, transform passes can depend upon *analysis* passes (i.e., 
passes that don't change the program).  All passes should avoid using 
addRequired<>() in their getAnalysisUsage<>() methods to depend upon 
transform passes.

Regards,

John Criswell

>
> Best,
> Yuxi
> ------------------------------------------------------------------------
> *From:* John Criswell [jtcriswel at gmail.com]
> *Sent:* Tuesday, June 21, 2016 11:01 AM
> *To:* Yuxi Chen
> *Cc:* llvm-dev at lists.llvm.org; llvmdev-bounces at cs.uiuc.edu; 
> llvmdev at cs.uiuc.edu
> *Subject:* Re: [llvm-dev] pass invalidation
>
> On 6/20/16 3:46 PM, Yuxi Chen wrote:
>> Hi,
>>
>> Thanks for your reply.
>> But I still don't know how a transform pass updates a new analysis 
>> pass after it modifies the IR. Can you explain it clearly? I am not 
>> familiar with pass management and invocation.
>
> Passes can have methods that allow their internal state to be updated 
> by other passes (the same way that their state can be queried by other 
> passes).  For example, the alias analysis passes have methods for 
> querying alias information as well as methods that allow other passes 
> to update the aliasing information when they make changes to the IR 
> (so that friendly optimization passes don't invalidate alias analysis 
> information when they make simple changes).
>
> Right now, your transform pass has a method which your other passes 
> are using to query information (I am guessing that your transform pass 
> is recording information on what it has done).  I am suggesting that 
> you create a new pass (call it "RK" for "Record Keeper") that 
> implements this method (call it getInfo()).  Additionally, the RK pass 
> also implements a method called setInfo() which the transform pass 
> uses to record any information that later passes will need.  In their 
> getAnalysisUsage<>() method, your passes preserve the results of the 
> RK pass.
>
> In this way, your transform pass modifies the IR and dumps any 
> information needed by your analysis passes into the RK pass.  The RK 
> pass does not modify the IR, so it doesn't create an 
> impossible-to-schedule pass pipeline like your transform pass does.
>
> If this isn't clear, please let me know.  I see that you're from 
> UChicago, so I'm guessing that you need this for a research project.
>
> Regards,
>
> John Criswell
>
>
>>
>> Best,
>> Yuxi
>> ------------------------------------------------------------------------
>> *From:* John Criswell [jtcriswel at gmail.com]
>> *Sent:* Sunday, June 19, 2016 10:05 AM
>> *To:* Mehdi Amini; Yuxi Chen
>> *Cc:* llvm-dev at lists.llvm.org; llvmdev-bounces at cs.uiuc.edu; 
>> llvmdev at cs.uiuc.edu
>> *Subject:* Re: [llvm-dev] pass invalidation
>>
>> On 6/19/16 4:28 AM, Mehdi Amini via llvm-dev wrote:
>>>
>>>> On Jun 18, 2016, at 10:44 PM, Yuxi Chen via llvm-dev 
>>>> <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
>>>>
>>>> Hi All,
>>>>
>>>> When I use llvm, I encounter a problem like "unable to schedule 
>>>> pass A required by C"
>>>> I investigated deeper. It's like:
>>>> I have three passes, say A, B, C(all are on function level)
>>>> A would modify IR code. (change instruction order)
>>>>
>>>> For pass B,
>>>> I would use the result of pass A, I use addRequired<B>(), and 
>>>> &getAnalysis<B>(), it works.
>>>>
>>>> void getAnalysisUsage(AU){
>>>> AU.addRequired<A>();
>>>> }
>>>>
>>>>
>>>> For pass C, it will use the results of pass A and B.
>>>> I use the way as used for pass B, but it failed, even for LoopInfo 
>>>> analysis pass(which is the built-in analysis pass).
>>>> void getAnalysisUsage(AU){
>>>> AU.addRequired<A>();
>>>> AU.addRequired<B>();
>>>> }
>>>>
>>>>
>>>> It seems because A would modify IR code, so for pass C, I need 
>>>> first load pass A then pass B, otherwise it will be invalidated.
>>>> However, when I change the using order, I still got error "unable 
>>>> to schedule pass A required by C".
>>>>
>>>> Does anyone encounter the same problem before and have a solution?
>>>> Any help is appreciated.
>>>
>>> Depending on other transformations isn’t recommended, and isn’t 
>>> supported by the soon-new-passmanager I believe.
>>> The expectation is that the passes are added in order to the pass 
>>> manager by the client.
>>
>> Depending on transformation passes isn't supported by the legacy 
>> PassManager, either.  Occasionally some passes can get away with it, 
>> but it often results in unschedule-able pass pipelines as above.
>>
>> If your transform pass does something to the code, other passes 
>> should either infer what it did by examining the IR.  the IR contains 
>> the definitive information about the program (because it is the program).
>>
>> Alternatively, you could create an analysis pass upon which both your 
>> transform and analysis passes depend.  The transform pass would 
>> update this new analysis pass with information on what it 
>> transformed; your later analysis passes could then query this 
>> information.  This approach is fragile, but it could work.
>>
>> Regards,
>>
>> John Criswell
>>
>>>
>>> In you case, I expect that it would “work” by removing the 
>>> dependency from C to A. If C requires B and B requires A, by 
>>> scheduling C you’ll get A, B, C in sequence.
>>>
>>>>>> Mehdi
>>>
>>>
>>>
>>>>
>>>> Best,
>>>> Yuxi
>>>> _______________________________________________
>>>> LLVM Developers mailing list
>>>> llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>>
>>>
>>>
>>> _______________________________________________
>>> LLVM Developers mailing list
>>> llvm-dev at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>
>>
>> -- 
>> John Criswell
>> Assistant Professor
>> Department of Computer Science, University of Rochester
>> http://www.cs.rochester.edu/u/criswell
>
>
> -- 
> John Criswell
> Assistant Professor
> Department of Computer Science, University of Rochester
> http://www.cs.rochester.edu/u/criswell


-- 
John Criswell
Assistant Professor
Department of Computer Science, University of Rochester
http://www.cs.rochester.edu/u/criswell

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


More information about the llvm-dev mailing list