<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">2017-01-25 23:20 GMT+07:00 Daniel Berlin <span dir="ltr"><<a href="mailto:dberlin@dberlin.org" target="_blank">dberlin@dberlin.org</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">+Chandler.<div><br><div class="gmail_extra"><br><div class="gmail_quote"><span>On Wed, Jan 25, 2017 at 7:04 AM, Serge Pavlov <span dir="ltr"><<a href="mailto:sepavloff@gmail.com" target="_blank">sepavloff@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>The fact is that sometimes domtree is not available.</div></div></blockquote><div><br></div><div><br></div></span><div>Then why is there a DominatorTree * to use?</div><div>It's fine for the analysis to be not available. When that happens,it should not produce a DominatorTree *.</div><div><br></div></div></div></div></div></blockquote><div> </div><div>`DominatorTree` is not an anaysis. `MachineDominatorTree` is an analysis an it is available, `getAnalysis<MachineDominatorTree>()` returns not null.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div><div class="gmail_extra"><div class="gmail_quote"><div></div><div>IE DominatorTree * should be a nullptr you can check against.</div><span><div> </div></span></div></div></div></div></blockquote><div><br></div><div>It can be, not should. `DT` is a private field of `MachineDominatorTree`, there are no requirements how to represent DominatorTree and how to work with it inside the pass. Using the check for presence of roots is merely simpler, the patch is more compact. </div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div><div class="gmail_extra"><div class="gmail_quote"><span><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div> If a function is `available_externally`  all codegen passes are skipped, although they are marked as required. </div></div></blockquote><div><br></div></span><div>See above :)</div><span><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>MachineDominatorTree is also skipped and there is no domtree at all.</div></div></blockquote><div><br></div></span><div>Again, so why is there a DominatorTree * to use?</div></div></div></div></div></blockquote><div><br></div><div>There are no problems to change implementation of `MachineDominatorTree` to use null pointer as indicator of unavailable domtree. It however doesn't present any gain, just another way to fetch info that the pass results are not available.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div><div class="gmail_extra"><div class="gmail_quote"><span><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div> Attempt to call `getRoot` for such domtree will obviously cause a crash. There is no way to get 'right' domtree in this case, so prior to using it we must either:</div><div><span class="gmail-m_3348125688270923206m_3336243068098332830m_-2761789139431732640gmail-Apple-tab-span" style="white-space:pre-wrap">   </span>1. Check if corresponding pass was indeed run, or</div><div><span class="gmail-m_3348125688270923206m_3336243068098332830m_-2761789139431732640gmail-Apple-tab-span" style="white-space:pre-wrap">   </span>2. Check the domtree state trying to reveal if it is valid.</div><div>The first approach was taken in <a href="https://reviews.llvm.org/D27190" target="_blank">https://reviews.llvm.org/D2719<wbr>0</a> but it was not accepted. This fix tries to use variant 2.</div></div></blockquote><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div><br></div><div>Just to emphasize a key point: there are cases when domtree is absent because the pass that it creates was not run and this behavior is by design.</div><div><br></div></div></blockquote><div><br></div></span><div>and in those cases, we should  not try to create an invalid datastructure. We should create no datastructure, and let people test against the nullptr.</div><div><br></div></div></div></div></div></blockquote><div>We do not create invalid datastructures, we use particular state of a data field to deduce that the pass does not have results, `getAnalysis` is useless in this particular case.</div><div><br></div><div>`MachineDominatorTree` is a pass and must obey API conventions, `getAnalysis` may be called for it and if it returns nullptr, a user knows that results are absent. `DominatorTree` is an internal datastructure, users don't work with it directly, they call `verifyDomTree` and it is a task of implementation to find out if domtree is available. There are no requirements how to do this.<br></div></div><br></div></div>