<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">On Apr 29, 2015, at 11:11 AM, Vladimir Ivanov <<a href="mailto:vladimir.x.ivanov@oracle.com" class="">vladimir.x.ivanov@oracle.com</a>> wrote:<br class=""><div><blockquote type="cite" class=""><br class="Apple-interchange-newline"><div class=""><span style="font-family: Helvetica; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Incremental inlining fails miserably when a call site dies while waiting for being inlined. It happens when previously inlined call causes some branches to be eliminated, but the info hasn't been propagated yet.</span><br style="font-family: Helvetica; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">I tried to enhance dead code detection logic, but failed. So, I reverted the following part of original fix:</span><br style="font-family: Helvetica; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">"(1) Reduce PhaseRemoveUseless frequency: inline in larger chunks until IR size LiveNodeCountInliningCutoff, then eliminate dead nodes."</span><br class=""></div></blockquote><br class=""></div><div>Oh, that's sad and annoying.</div><div><br class=""></div><div>I have a couple of comments.</div><div><br class=""></div><div>Since you are cleaning up the contract for inline_incrementally_one (a good idea), remove the cross-call role of the global inlining_progress flag, by having inline_incrementally_one return a boolean sample of inlining_progress, meaning "there is more work to be done".  Then the only reader of that flag will be inline_incrementally_one itself, and the only asserter (writer to true) of the flag will be the call generator.</div><div><br class=""></div><div>Some complex optimizations can become buggy when the graph changes due to dead path elimination.  One way we can defend against this is to delay the removal of dead paths to a cleanup phase.  There are several ways to do this trick.  To maintain certain connectivity properties, we introduce not-really-conditional NeverBranch nodes, which are rewritten extremely late.  A "washable" version of NeverBranch nodes (which "washes out" sooner than the current ones) could perhaps be used to delay path-cutting.  More commonly, in loop opts, we use various kinds of opaque nodes to block constant folding when it would be inconvenient.  Perhaps during incremental inlining we could block path-cutting by introducing some kind of opaque data or control node, which would wash out in the PhaseIterGVN that you originally intended to run after several rounds of incremental inlining.</div><div><br class=""></div><div>I'm not sure if this would be profitable in this case, but the idea of delaying path-cutting has been useful in the past.</div><div><br class=""></div><div> John</div><div><br class=""></div></body></html>