<div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jan 22, 2014 at 1:01 AM, Andrew Trick <span dir="ltr"><<a href="mailto:atrick@apple.com" target="_blank">atrick@apple.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="adM"><div class="im"><div><div>On Jan 22, 2014, at 12:44 AM, Chandler Carruth <<a href="mailto:chandlerc@gmail.com" target="_blank">chandlerc@gmail.com</a>> wrote:</div>
<br><blockquote type="cite"><div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jan 22, 2014 at 12:33 AM, Andrew Trick <span dir="ltr"><<a href="mailto:atrick@apple.com" target="_blank">atrick@apple.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>> There appear to be two chunks of "functionality" provided by loop passes:<br>
><br>
> 1) A worklist of loops to process. This is very rarely used:<br>
> 1.1) LoopSimplify and LoopUnswitch add loops to the queue.<br>
<br>
</div>I’m making this up without much thought, but we may benefit from iterative loop transforms like Rotate -> LICM -> Unswitch -> Rotate -> LICM. We might need to come up with a preferred alternative: we can either continue to convert transforms into a utilities, or we can invent new pass manager tricks. e.g. iterate over a set of function passes or selectively run a pass on “dirty” regions.</blockquote>

</div><br>This is a really good point. Owen pointed it out to me as well in another guise: when we unroll a loop, we need to re-run a bunch of the passes, but re-running them when we *haven't* successfully unrolled a loop is a total waste.</div>

<div class="gmail_extra"><br></div><div class="gmail_extra">I'd like to think more about this, so a simpler option: what if we *just* extract LoopSimplify and LCSSA? If all the LoopPasses preserve these, then them being function passes would be fine. This would allow us to at least *start* writing function passes over loops (like the LoopVectorizer) rather than being forced to phrase them as LoopPasses.</div>

<div class="gmail_extra"><br></div><div class="gmail_extra">I think I could implement this simpler option right away, and that would unblock a lot of our efforts around unrolling, vectorizing, and PGO.</div></div>
</blockquote></div><br></div></div><div>Great. LoopSimplify can be used as a utility to cleanup transformed loops if needed.</div><div></div></blockquote></div></div><br><div>This would really only work with pretty specialized logic in the LoopVectorizer and LSR to select only the cleanup aspects of LoopSimplify that they need. And it wouldn't even have any utility in LSR.</div>
<div><br></div><div>Unfortunately, the loop pass manager makes doing this incrementally hard. The loop vectorizer runs on the inner most loop, makes in not-simplified. We then pop out to the outer loop and verify everything. The now-function-pass LoopSimplify fails its verification because it verifies *all* of the loops in the function, even though the inner loops aren't going to be revisited.</div>
<div><br></div><div>My suggestion is to disable the whole-function verification in LoopSimplify while we're fixing this. We can instead have LCSSA verify the specific loop it is processing which will give us the same safety guarantees. Does that sound OK?</div>
<div><br></div><div>That will let me do the following:</div><div><br></div><div>1) Hoist LoopSimplify to a function pass</div><div>2) Hoist LCSSA to a function pass</div><div>3) Make the LoopVectorizer a function pass</div>
<div>4) Make IVUsers a utility of LSR, run on-demand for the loop that LSR is processing (no pass manager involvement)</div><div>5) Make LSR a function pass</div><div><br></div><div>As a consequence of this, we will actually fix the long-standing issue of LoopSimplify vs. ScalarEvolution, and cut the number of runs of LoopSimplify and LCSSA by half (!!!) so I think this is worth doing.</div>
<div><br></div><div>I have a patch that does #1 already, but wanted to check that you're OK weakening the verification. Otherwise, I have to do 1, 2, 3, and 5 in a single commit, or teach the LoopVectorizer and LSR to preserve LoopSimplify... Yuck.</div>
<div><br></div><div>-Chandler</div></div>