<html dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1252">
<style id="owaParaStyle" type="text/css">P {margin-top:0;margin-bottom:0;}</style>
</head>
<body ocsi="0" fpstyle="1" bgcolor="#FFFFFF">
<div style="direction: ltr;font-family: Tahoma;color: #000000;font-size: 10pt;">Hi,
<br>
<br>
Thanks for your reply. <br>
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.
<br>
<br>
Best,<br>
Yuxi<br>
<div style="font-family: Times New Roman; color: #000000; font-size: 16px">
<hr tabindex="-1">
<div style="direction: ltr;" id="divRpF16799"><font color="#000000" face="Tahoma" size="2"><b>From:</b> John Criswell [jtcriswel@gmail.com]<br>
<b>Sent:</b> Sunday, June 19, 2016 10:05 AM<br>
<b>To:</b> Mehdi Amini; Yuxi Chen<br>
<b>Cc:</b> llvm-dev@lists.llvm.org; llvmdev-bounces@cs.uiuc.edu; llvmdev@cs.uiuc.edu<br>
<b>Subject:</b> Re: [llvm-dev] pass invalidation<br>
</font><br>
</div>
<div></div>
<div>
<div class="moz-cite-prefix">On 6/19/16 4:28 AM, Mehdi Amini via llvm-dev wrote:<br>
</div>
<blockquote type="cite"><br class="">
<div>
<blockquote type="cite" class="">
<div class="">On Jun 18, 2016, at 10:44 PM, Yuxi Chen via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" class="" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:</div>
<br class="Apple-interchange-newline">
<div class="">
<div class="">Hi All, 
<div class=""><br class="">
</div>
<div class="">When I use llvm, I encounter a problem like "unable to schedule pass A required by C"</div>
<div class="">I investigated deeper. It's like:</div>
<div class="">I have three passes, say A, B, C(all are on function level)</div>
<div class="">A would modify IR code. (change instruction order)</div>
<div class=""><br class="">
</div>
<div class="">For pass B, </div>
<div class="">I would use the result of pass A, I use addRequired<B>(), and &getAnalysis<B>(), it works. </div>
<div class=""><br class="">
</div>
<div class="">void getAnalysisUsage(AU){</div>
<div class=""><span class="Apple-tab-span"></span>AU.addRequired<A>();</div>
<div class="">}</div>
<div class=""><br class="">
</div>
<div class=""><br class="">
</div>
<div class="">For pass C, it will use the results of pass A and B. </div>
<div class="">I use the way as used for pass B, but it failed, even for LoopInfo analysis pass(which is the built-in analysis pass).</div>
<div class="">void getAnalysisUsage(AU){</div>
<div class=""><span class=""><span class="Apple-tab-span"></span>AU.addRequired<A>();</span></div>
<div class=""><span class=""><span class="Apple-tab-span"></span>AU.addRequired<B>();</span></div>
<div class=""><span class="">}</span></div>
<div class=""><br class="">
</div>
<div class=""><br class="">
</div>
<div class="">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. </div>
<div class="">However, when I change the using order, I still got error "unable to schedule pass A required by C".</div>
<div class=""><br class="">
</div>
<div class="">Does anyone encounter the same problem before and have a solution?</div>
</div>
</div>
</blockquote>
<blockquote type="cite" class="">
<div class="">
<div class="">
<div class="">Any help is appreciated. </div>
</div>
</div>
</blockquote>
<div><br class="">
</div>
<div>Depending on other transformations isn’t recommended, and isn’t supported by the soon-new-passmanager I believe.</div>
<div>The expectation is that the passes are added in order to the pass manager by the client.</div>
</div>
</blockquote>
<br>
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.<br>
<br>
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).<br>
<br>
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.<br>
<br>
Regards,<br>
<br>
John Criswell<br>
<br>
<blockquote type="cite">
<div>
<div><br class="">
</div>
<div>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.</div>
<div><br class="">
</div>
<div>— </div>
<div>Mehdi</div>
<div><br class="">
</div>
<div><br class="">
</div>
<br class="">
<blockquote type="cite" class="">
<div class="">
<div class="">
<div class=""><br class="">
</div>
<div class="">Best,</div>
<div class="">Yuxi</div>
</div>
<span class="">_______________________________________________</span><br class="">
<span class="">LLVM Developers mailing list</span><br class="">
<a href="mailto:llvm-dev@lists.llvm.org" class="" target="_blank">llvm-dev@lists.llvm.org</a><br class="">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" class="" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a></div>
</blockquote>
</div>
<br class="">
<br>
<fieldset class="mimeAttachmentHeader" target="_blank"></fieldset> <br>
<pre>_______________________________________________
LLVM Developers mailing list
<a class="moz-txt-link-abbreviated" href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>
<a class="moz-txt-link-freetext" href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a>
</pre>
</blockquote>
<br>
<p><br>
</p>
<pre class="moz-signature" cols="72">-- 
John Criswell
Assistant Professor
Department of Computer Science, University of Rochester
<a class="moz-txt-link-freetext" href="http://www.cs.rochester.edu/u/criswell" target="_blank">http://www.cs.rochester.edu/u/criswell</a></pre>
</div>
</div>
</div>
</body>
</html>