<table><tr><td style="">sanjoy accepted this revision.<br />sanjoy added a comment.<br />This revision is now accepted and ready to land.
</td><a style="text-decoration: none; padding: 4px 8px; margin: 0 8px 8px; float: right; color: #464C5C; font-weight: bold; border-radius: 3px; background-color: #F7F7F9; background-image: linear-gradient(to bottom,#fff,#f1f0f1); display: inline-block; border: 1px solid rgba(71,87,120,.2);" href="https://reviews.llvm.org/D24225" rel="noreferrer">View Revision</a></tr></table><br /><div><p>lgtm with some comments inline</p>

<p>Ignore the comment with <tt style="background: #ebebeb; font-size: 13px;">.</tt> as the body -- for some reason phabricator refused to delete a stale comment.</p></div><br /><div><div style="margin: 6px 0 12px 0;"><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://reviews.llvm.org/D24225#inline-214930" rel="noreferrer">View Inline</a><span style="color: #4b4d51; font-weight: bold;">LazyCallGraph.h:736</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; background: #d0ffd0;">    <span style="color: #74777d">/// the edge is an outgoing edge to some descendant SCC. In these cases</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: #d0ffd0;">    <span style="color: #74777d">/// there is strictly no change to the cyclic structure of SCCs or RefSCCs.</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: #d0ffd0;">    <span style="color: #74777d">///</span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">I'd drop the "strictly" (here and below).  (Or clarify "strictly" as opposed to what?).</p></div></div><br /><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://reviews.llvm.org/D24225#inline-215136" rel="noreferrer">View Inline</a><span style="color: #4b4d51; font-weight: bold;">LazyCallGraph.h:908</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; background: #d0ffd0;">  <span style="color: #74777d">/// Note that the function must have an empty use list, and the call graph</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: #d0ffd0;">  <span style="color: #74777d">/// must be up-to-date prior to calling this. That means it is by itself in</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: #d0ffd0;">  <span style="color: #74777d">/// an SCC which is by itself in a RefSCC, etc. No structural changes result</span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">s/an SCC/a maximal SCC/, to make things 100% obvious.</p>

<p style="padding: 0; margin: 8px;">Same for RefSCC</p></div></div><br /><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://reviews.llvm.org/D24225#inline-215710" rel="noreferrer">View Inline</a><span style="color: #4b4d51; font-weight: bold;">LazyCallGraph.cpp:1340</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; background: #d0ffd0;">  <span class="n">RefSCC</span> <span style="color: #aa2211">&</span><span class="n">TargetRC</span> <span style="color: #aa2211">=</span> <span style="color: #aa2211">*</span><span class="n">G</span><span style="color: #aa2211">-></span><span class="n">lookupRefSCC</span><span class="p">(</span><span class="n">TargetN</span><span class="p">);</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: #d0ffd0;">  <span style="color: #aa4000">if</span> <span class="p">(</span><span style="color: #aa2211">&</span><span class="n">TargetRC</span> <span style="color: #aa2211">==</span> <span style="color: #aa4000">this</span><span class="p">)</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: #d0ffd0;">    <span style="color: #aa4000">return</span><span class="p">;</span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">If we're inserting a call edge and <tt style="background: #ebebeb; font-size: 13px;">&TargetRC == this</tt> then I think we should assert that the target <tt style="background: #ebebeb; font-size: 13px;">SCC</tt> is equal to or a descendent of the source <tt style="background: #ebebeb; font-size: 13px;">SCC</tt>.</p>

<p style="padding: 0; margin: 8px;">Actually, perhaps we should assert the target <tt style="background: #ebebeb; font-size: 13px;">SCC</tt> is equal to or a descendent of the source <tt style="background: #ebebeb; font-size: 13px;">SCC</tt> whenever we're inserting a call edge (i.e. without regards to whether <tt style="background: #ebebeb; font-size: 13px;">&TargetRC == this</tt>).  That'll be partially redundant with <tt style="background: #ebebeb; font-size: 13px;">TargetRC.isDescendantOf(*this)</tt> below, but I think that's fine.</p></div></div><br /><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://reviews.llvm.org/D24225#inline-215154" rel="noreferrer">View Inline</a><span style="color: #4b4d51; font-weight: bold;">LazyCallGraph.cpp:1408</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; background: #d0ffd0;"><span style="color: #aa4000">void</span> <span class="n">LazyCallGraph</span><span style="color: #aa2211">::</span><span class="n">removeDeadFunction</span><span class="p">(</span><span class="n">Function</span> <span style="color: #aa2211">&</span><span class="n">F</span><span class="p">)</span> <span class="p">{</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: #d0ffd0;">  <span class="n">assert</span><span class="p">(</span><span class="n">F</span><span class="p">.</span><span class="n">use_empty</span><span class="p">()</span> <span style="color: #aa2211">&&</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: #d0ffd0;">         <span style="color: #766510">"This routine should only be called on trivially dead functions!"</span><span class="p">);</span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">How about recursive functions?  It seems reasonable to want to all <tt style="background: #ebebeb; font-size: 13px;">removeDeadFunction</tt> on them too.</p></div></div><br /><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://reviews.llvm.org/D24225#inline-215715" rel="noreferrer">View Inline</a><span style="color: #4b4d51; font-weight: bold;">LazyCallGraph.cpp:1413</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; background: #d0ffd0;">  <span style="color: #aa4000">if</span> <span class="p">(</span><span class="n">EII</span> <span style="color: #aa2211">!=</span> <span class="n">EntryIndexMap</span><span class="p">.</span><span class="n">end</span><span class="p">())</span> <span class="p">{</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: #d0ffd0;">    <span class="n">EntryEdges</span><span class="p">[</span><span class="n">EII</span><span style="color: #aa2211">-></span><span class="n">second</span><span class="p">]</span> <span style="color: #aa2211">=</span> <span class="n">Edge</span><span class="p">();</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: #d0ffd0;">    <span class="n">EntryIndexMap</span><span class="p">.</span><span class="n">erase</span><span class="p">(</span><span class="n">EII</span><span class="p">);</span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">Any reason why you can't compact the <tt style="background: #ebebeb; font-size: 13px;">EntryEdges</tt> vector here (i.e. swap the last element with the <tt style="background: #ebebeb; font-size: 13px;">EII->second</tt> th element, pop the last element and update <tt style="background: #ebebeb; font-size: 13px;">EntryIndexMap</tt>)?</p></div></div><br /><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://reviews.llvm.org/D24225#inline-215711" rel="noreferrer">View Inline</a><span style="color: #4b4d51; font-weight: bold;">LazyCallGraph.cpp:1425</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; background: #d0ffd0;">  <span style="color: #aa4000">auto</span> <span class="n">NI</span> <span style="color: #aa2211">=</span> <span class="n">NodeMap</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span style="color: #aa2211">&</span><span class="n">F</span><span class="p">);</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: #d0ffd0;">  <span style="color: #aa4000">if</span> <span class="p">(</span><span class="n">NI</span> <span style="color: #aa2211">==</span> <span class="n">NodeMap</span><span class="p">.</span><span class="n">end</span><span class="p">())</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: #d0ffd0;">    <span style="color: #74777d">// Not in the graph at all!</span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">.</p></div></div><br /><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://reviews.llvm.org/D24225#inline-215712" rel="noreferrer">View Inline</a><span style="color: #4b4d51; font-weight: bold;">LazyCallGraph.cpp:1434</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; background: #d0ffd0;">    <span style="color: #74777d">// No SCC walk has begun, so removing this is fine and there is nothing</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: #d0ffd0;">    <span style="color: #74777d">// else necesasry at this point but clearing out the node.</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: #d0ffd0;">    <span class="n">N</span><span class="p">.</span><span class="n">clear</span><span class="p">();</span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">s/necesasry/necessary/</p></div></div><br /><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://reviews.llvm.org/D24225#inline-215713" rel="noreferrer">View Inline</a><span style="color: #4b4d51; font-weight: bold;">LazyCallGraph.cpp:1440</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; background: #d0ffd0;">  <span style="color: #74777d">// Check that we aren't going to break the DFS walk.</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: #d0ffd0;">  <span class="n">assert</span><span class="p">(</span><span class="n">std</span><span style="color: #aa2211">::</span><span class="n">all_of</span><span class="p">(</span><span class="n">DFSStack</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">DFSStack</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: #d0ffd0;">                     <span class="p">[</span><span style="color: #aa2211">&</span><span class="n">N</span><span class="p">](</span><span style="color: #aa4000">const</span> <span class="n">std</span><span style="color: #aa2211">::</span><span class="n">pair</span><span style="color: #aa2211"><</span><span class="n">Node</span> <span style="color: #aa2211">*</span><span class="p">,</span> <span class="n">edge_iterator</span><span style="color: #aa2211">></span> <span style="color: #aa2211">&</span><span class="n">Element</span><span class="p">)</span> <span class="p">{</span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;"><tt style="background: #ebebeb; font-size: 13px;">llvm::all_of</tt></p></div></div></div></div><br /><div><a href="https://reviews.llvm.org/D24225" rel="noreferrer">https://reviews.llvm.org/D24225</a></div><br />